С Новым годом! Форум программистов, компьютерный форум, киберфорум
Python для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
71 / 55 / 24
Регистрация: 28.03.2016
Сообщений: 171

Представление объектов в памяти

19.03.2025, 17:21. Показов 1442. Ответов 14

Студворк — интернет-сервис помощи студентам
Может кто объяснить почему код возвращает одинаковые id и True при сравнении на is:
Python
1
2
3
4
5
6
a = '100'
b = '100'
 
print(id(a))
print(id(b))
print(a is b)
но при этом следующий код возвращает разные id и False соответственно, несмотря на то, что str неизменяемый тип и в источниках встречал что двум неизменяемым объектам выделять память избыточно?
Python
1
2
3
4
5
6
a = '100'
b = str(100)
 
print(id(a))
print(id(b))
print(a is b)
Какое правило тут? Явно не "если строка вычислена, а не задана литералом, поиск совпадающих по памяти не происходит", т.к. следующий пример тоже возвращает Тру:
Python
1
2
3
4
5
6
a = '100'
b = '1' + '0' * 2
 
print(id(a))
print(id(b))
print(a is b)
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
19.03.2025, 17:21
Ответы с готовыми решениями:

Django: пишу тесты и потерял созданный и сохраненный в БД объект
Django 1.9.6 Есть модель Person. И к ней тесты. Запускаем python manage.py test. Тестовую базая база данных создалась. ...

Преобразовать Json-схему в объект и обратно с выбором атрибутов
Добрый день У меня есть json схема. В ней есть несколько полей. Можно ли в питоне преобразовать эту схему в объект? Также хотелось бы...

Как сохранить объект без явной инициализации?
Есть класс который подключается к бд и возвращает построчно ответ. class Selector(): @staticmethod def...

14
1185 / 755 / 127
Регистрация: 10.03.2012
Сообщений: 4,860
19.03.2025, 17:29
Цитата Сообщение от Полурослик Посмотреть сообщение
b = str(100)
В этом случае создаётся новый объект строки, поэтому это разные объекты в памяти и выдается False, так как is проверяет, ссылаются ли две переменные на один и тот же объект в памяти
0
71 / 55 / 24
Регистрация: 28.03.2016
Сообщений: 171
19.03.2025, 17:39  [ТС]
Whitecolor, да, это понимаю. По какому правилу решается когда создать именно новый объект? Вот в этом вопрос.

Например, если я к int привожу из любого типа, а такое число уже есть, новый объект не создается. А если привожу к строке или кортежу — создается. Потому что они не атомарные?
0
261 / 35 / 7
Регистрация: 03.02.2025
Сообщений: 121
19.03.2025, 17:41
Цитата Сообщение от Полурослик Посмотреть сообщение
a = '100'
b = '100'
Для экономия места в памяти эти два числа находятся в одном и том же месте в памяти. Так как они одинаковы.
0
71 / 55 / 24
Регистрация: 28.03.2016
Сообщений: 171
19.03.2025, 17:44  [ТС]
Eduard1977, это я и беру за начальное предположение — одинаковые неизменяемые объекты не хранятся дважды, а указывают на одну область памяти.

Почему только тогда в примере 2 одинаковые строки, полученные разными способами, хранятся отдельно?
0
 Аватар для s_t_r_a_j
526 / 179 / 58
Регистрация: 12.02.2023
Сообщений: 641
19.03.2025, 18:42
потому что str это изменяемый тип данных, а int неизменяемый. тоже самое (как с int) произойдет и с типом данных tuple кортежем, так как он тоже неизменяемый, а вот со списком тоже как со строкой получится (изменяемый тип)
0
Автоматизируй это!
Эксперт Python
 Аватар для Welemir1
7390 / 4817 / 1246
Регистрация: 30.03.2015
Сообщений: 13,664
Записей в блоге: 29
19.03.2025, 19:25
Лучший ответ Сообщение было отмечено Полурослик как решение

Решение

Цитата Сообщение от Полурослик Посмотреть сообщение
в источниках встречал что двум неизменяемым объектам выделять память избыточно?
это где ты встречал?

Цитата Сообщение от Полурослик Посмотреть сообщение
По какому правилу решается когда создать именно новый объект? Вот в этом вопрос.
внутренние особенности cpython полагаться на которые в коде не стоит

Цитата Сообщение от Полурослик Посмотреть сообщение
если я к int привожу из любого типа, а такое число уже есть, новый объект не создается
только для чисел от -5 до 255 (если точно помню верхнюю границу)
Python
1
2
3
4
5
6
7
8
9
10
>>> x=100500
>>> id(x)
4343925360
>>> y=int('100500')
>>> id(y)
4343924720
>>> x == y
True
>>> x is y
False
Цитата Сообщение от Полурослик Посмотреть сообщение
Явно не "если строка вычислена, а не задана литералом, поиск совпадающих по памяти не происходит",
именно так и работает) если можно выражение вычислить при компиляции в байткод, то тогда будет использовано интернирование строк (один и тот же объект в памяти), если нет, то разные объекты.
В своем 3 примере просто вынеси 2 в переменную и сразу поменяется результат, потому что интерпретатор не знает в момент компиляции результат
Python
1
2
3
4
5
6
7
a = '100'
x=2
b = '1' + '0' * x
 
print(id(a))
print(id(b))
print(a is b)
Добавлено через 2 минуты
Цитата Сообщение от s_t_r_a_j Посмотреть сообщение
str это изменяемый тип данных
точно?
Strings are immutable sequences of Unicode code points.
1
71 / 55 / 24
Регистрация: 28.03.2016
Сообщений: 171
19.03.2025, 19:46  [ТС]
Welemir1, спасибо! Единственное что осталось неясно теперь, почему так с интами?
Python
1
2
3
4
5
x = 1
a = 10 + x
b = 11
 
print(a is b) # True
и
Python
1
2
3
4
5
x = 1
a = 100000 + x
b = 100001
 
print(a is b) # False
Из-за того, как представлено целое число для "длинной арифметики" в памяти или еще по какой-либо причине?
0
Автоматизируй это!
Эксперт Python
 Аватар для Welemir1
7390 / 4817 / 1246
Регистрация: 30.03.2015
Сообщений: 13,664
Записей в блоге: 29
19.03.2025, 19:51
Цитата Сообщение от Полурослик Посмотреть сообщение
Единственное что осталось неясно теперь, почему так с интами?
я же написал, для оптимизации целые числа от -5 до 255 (самые используемые) создаются ровно 1 раз. И то не помню верхнюю границу, может и 253.
1
261 / 35 / 7
Регистрация: 03.02.2025
Сообщений: 121
19.03.2025, 19:57
Цитата Сообщение от Welemir1 Посмотреть сообщение
И то не помню верхнюю границу, может и 253.
наверно 250. Так как 255 - 5 = 250

Добавлено через 27 секунд
Используется один байт. Это предположение моё.
0
Автоматизируй это!
Эксперт Python
 Аватар для Welemir1
7390 / 4817 / 1246
Регистрация: 30.03.2015
Сообщений: 13,664
Записей в блоге: 29
19.03.2025, 20:01
Eduard1977, а ты не гадай, а проверь, написав код проверки от -100 до 1000, и тут напиши что получилось, интересная задачка вроде для разминки
0
261 / 35 / 7
Регистрация: 03.02.2025
Сообщений: 121
19.03.2025, 20:20
Цитата Сообщение от Welemir1 Посмотреть сообщение
я же написал, для оптимизации целые числа от -5 до 255 (самые используемые) создаются ровно 1 раз. И то не помню верхнюю границу, может и 253.
По моему это не так. Вот этот код выдаёт следующее.
Python
1
2
3
a = 103500
b = 103500
print(id(a),id(b))
2258400426864 2258400426864

Добавлено через 47 секунд
Для большого числа один и тот же адрес.
0
Автоматизируй это!
Эксперт Python
 Аватар для Welemir1
7390 / 4817 / 1246
Регистрация: 30.03.2015
Сообщений: 13,664
Записей в блоге: 29
19.03.2025, 20:44
эххх... то есть выше про интернирование и создание объектов на этапе компиляции не стал читать?
0
261 / 35 / 7
Регистрация: 03.02.2025
Сообщений: 121
19.03.2025, 21:11
Вот этот код дал результаты
Python
1
2
3
for a in range(-100, 1000):
    b = int(str(a))
    print(a, id(a), id(b))
от -5 до 256

Добавлено через 11 минут
Не знаю код правильный или нет?
1
Автоматизируй это!
Эксперт Python
 Аватар для Welemir1
7390 / 4817 / 1246
Регистрация: 30.03.2015
Сообщений: 13,664
Записей в блоге: 29
19.03.2025, 21:11
Цитата Сообщение от Eduard1977 Посмотреть сообщение
от -5 до 256
бинго!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
19.03.2025, 21:11
Помогаю со студенческими работами здесь

Как перевести время в виде PT8H30M в объект datetime?
Здравствуйте. В питоне новичок, поэтому вопрос может показаться глупым, но тем не менее. Я получаю от стороннего SOAP сервиса строку со...

Как записать объект класса в файл?
Добрый день! Подскажите пожалуйста, объект класса можно целиком записать в файл? У меня выводится только что-то вроде По...

Sequence объект в Python
Всем добрый вечер. Вопрос простой: у меня есть обычный массив картежей (tuple). Мне нужно его конвертировать в тип sequence. Как мне...

Найти некоторый объект на изображении
Мне требуется написать подобную программу на Python, но я очень слабо представляю что и как делать(я новичок). Времени у меня неделя и я...

Как создать глобальный объект в функции?
Я создаю функцию, в которой создается объект, а когда я проверяю наличие объекта, его нет. Ночью я понял что это из-за того, что объект...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru