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

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

19.03.2025, 17:21. Показов 1475. Ответов 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
1200 / 769 / 128
Регистрация: 10.03.2012
Сообщений: 4,968
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
262 / 37 / 7
Регистрация: 03.02.2025
Сообщений: 138
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
7392 / 4819 / 1246
Регистрация: 30.03.2015
Сообщений: 13,694
Записей в блоге: 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
7392 / 4819 / 1246
Регистрация: 30.03.2015
Сообщений: 13,694
Записей в блоге: 29
19.03.2025, 19:51
Цитата Сообщение от Полурослик Посмотреть сообщение
Единственное что осталось неясно теперь, почему так с интами?
я же написал, для оптимизации целые числа от -5 до 255 (самые используемые) создаются ровно 1 раз. И то не помню верхнюю границу, может и 253.
1
262 / 37 / 7
Регистрация: 03.02.2025
Сообщений: 138
19.03.2025, 19:57
Цитата Сообщение от Welemir1 Посмотреть сообщение
И то не помню верхнюю границу, может и 253.
наверно 250. Так как 255 - 5 = 250

Добавлено через 27 секунд
Используется один байт. Это предположение моё.
0
Автоматизируй это!
Эксперт Python
 Аватар для Welemir1
7392 / 4819 / 1246
Регистрация: 30.03.2015
Сообщений: 13,694
Записей в блоге: 29
19.03.2025, 20:01
Eduard1977, а ты не гадай, а проверь, написав код проверки от -100 до 1000, и тут напиши что получилось, интересная задачка вроде для разминки
0
262 / 37 / 7
Регистрация: 03.02.2025
Сообщений: 138
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
7392 / 4819 / 1246
Регистрация: 30.03.2015
Сообщений: 13,694
Записей в блоге: 29
19.03.2025, 20:44
эххх... то есть выше про интернирование и создание объектов на этапе компиляции не стал читать?
0
262 / 37 / 7
Регистрация: 03.02.2025
Сообщений: 138
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
7392 / 4819 / 1246
Регистрация: 30.03.2015
Сообщений: 13,694
Записей в блоге: 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
Ответ Создать тему
Новые блоги и статьи
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
Горе от ума
kumehtar 07.04.2026
Эта мне ментальная установка, что вот прямо сейчас, мол, мне для полного счастья не хватает (нужное вписать), и когда я этого достигну - тогда и полный кайф. Одна из самых сильных ловушек на пути. . . .
Использование значений реквизитов справочника в документе, с определенными условиями и правами
Maks 07.04.2026
1. Контроль срока действия договора Алгоритм из решения ниже реализован на примере нетипового документа "ЗаявкаНаРаботу", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если. . .
Доступность команды формы по условию
Maks 07.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: сделать доступной кнопку (команда формы "ЗавершитьСписание") при. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru