2014-01-13 5 views
2

Два индивидуально созданных изменяемых списка имеют разные идентификаторы.Почему два отдельно созданных неизменяемых объекта имеют одинаковые идентификаторы и изменяемые объекты, разные, хотя оба относятся к одинаковым значениям?

Python SHELL: (изменяемые)

>>> mylist = ['spam', 'eggs'] 
>>> yourlist = ['spam', 'eggs'] 
>>> id(mylist), id(yourlist) 
(49624456, 48910408) 

В то время как две индивидуально созданные неизменные строки имеют одинаковые идентификаторы.

Python SHELL: (неизменное)

>>> a = 10 
>>> b = 10 
>>> id(a), id(b) 
(507099072, 507099072) 

Является a и b ссылки на тот же объект? Если нет, то почему идентификаторы похожи? Есть mylist и yourlist ссылки на разные объекты? Если да, то почему у них разные идентификаторы.

+0

измененные объекты могут по этой причине мутировать, список создается дважды, но если вы проверяете идентификатор элемента 0 обоих списков, они должны быть идентичными. Поскольку списки изменяемы, вы не можете ожидать, что список указывает на один и тот же объект, даже если каждая «ячейка» внутри списка указывает на те же «неизменные» объекты. Неизбежные объекты не могут мутировать по этой причине, python может оптимизировать его и предотвратить дублирование. –

ответ

3

Python кэширует некоторые небольшие строки и число: http://docs.python.org/2/c-api/int.html#PyInt_FromLong

Текущая реализация хранит массив целых объектов для всех целых чисел от -5 до 256, при создании Int в этом диапазоне вы на самом деле просто верните ссылку на существующий объект.

И id(some_list) всегда дает адрес контейнера - список объектов в памяти, а не строки в списке!

+0

Есть ли способ создать две переменные с одинаковым значением между -5 и 256, но иметь их как разные объекты? 'a = 2',' b = 2', а затем 'a is b' вернет' True'. Есть ли способ иметь оба значения со значением 2, но быть разными объектами? –

+0

@JesseZhuang Я вижу только один путь - путем подкласса int. Все экземпляры вашего собственного целочисленного класса будут разными объектами ... – ndpu