Python может принять решение разделить неизменные объекты хранения (строки, целые числа, ...)
Поскольку они неизменяемы, они прозрачны для пользователя. Это просто экономит память.
a[0] is b[0]
может быть правдой или ложью. С другой стороны
a[0] is c[0]
всегда правда, потому что a is c
. (И модификации a
изменений c
)
Но поскольку list
типа изменчив, a
не может быть b
(Python не позволяет себе оптимизировать хранение в этом случае). Это независимые объекты. Изменение a
не может изменить b
.
примечание о моем «может быть истинным или ложным» замечанием. Рассмотрим это в питона 3.4
>>> b=1234567890
>>> a=[1234567890]
>>> b is a[0]
False
Python не удосужились сделать связь между b
и a[0]
. Также случается с длинными строками (я предполагаю, что это была бы проблема производительности с низкой вероятностью, чтобы найти точное большое число 2 раза подряд, тогда как 1
имеет больше шансов быть повторенным во всей программе)
Однако, если вы сделаете это вы получите другой результат:
>>> b=1234567890
>>> a=[b,1,2]
>>> b is a[0]
True
(я бы не сказал точно, почему, как он может изменяться в зависимости, будет ли она хранится в виде длинной ИНТ или просто INT, значение или адрес, и т.д ..., но Python определенно больше информации о дублирующейся стоимости здесь!)
Вывод: не полагайтесь на это для immuta объектов. Используйте ==
в любое время.
Почему ' a' и 'b' указывают на одно и то же место? просто потому, что у них есть списки с одинаковыми значениями? – UnholySheep
Вот как это происходит на питоне. Таким образом, вы создаете a = 5 и itll search, если 5 уже существует, и если это будет указывать на это. забавное упражнение для вас: a = [1,2,3,4,5]; g = 4; g - [3]; Правда. смешно, правильно ?? !! может кто-то подтвердить, правильно ли я сказал? PS - Новое для сообщества –
Целые числа неизменяемы, список изменен. Представленные ответы объясняют это очень подробно. «То, как это происходит в python» также явно ошибочно, иначе вы не увидите результат, который видите. – UnholySheep