Найти - Пользователи
Полная версия: Изменяемые/неизменяемые типы данных
Начало » Python для новичков » Изменяемые/неизменяемые типы данных
1 2
dnox
Всем доброго дня. Всегда думал, что основная разница между изменяемыми и неизменяемыми типами - то что они соответственно unhashable и hashable. Но недавно узнал, что это не совсем так. Так вот возник вопрос, с какой целью идет разделение на изменяемые и неизменяемые типы? В частности, на примере tuple и list. Я, конечно, предполагаю что tuple лучше использовать для каких-то констант/данных, изменение которых нежелательно, но хотелось бы более развернутого ответа.
Ну и второй вопрос: где можно почитать про механизм подсчета хэша объекта-ключа при создании словаря?
Singularity
dnox
Ну и второй вопрос: где можно почитать про механизм подсчета хэша объекта-ключа при создании словаря?
http://hg.python.org/cpython/file/1cb0c05d71af/Objects/dictobject.c
dnox
Singularity
http://hg.python.org/cpython/file/1cb0c05d71af/Objects/dictobject.c

Спасибо. Пришлось полазить по ссылкам, но то, что нужно я нашел.
Вопрос по типам еще стоит)
bismigalis
основное отличие, неизменяемые могут быть ключом в словаре
dnox
bismigalis
основное отличие, неизменяемые могут быть ключом в словаре
Я тоже так думал, на этом и попался.
([1,2,3], 4 , 5)
- неизменяемый tuple, но ключом в словаре он быть не может.
bismigalis
dnox
([1,2,3], 4 , 5)
а это что неизменяемая структура?
dnox
bismigalis
а это что неизменяемая структура?
Ну, так как это все еще tuple, то я предполагаю, что да.
bismigalis
часть этого тупла может измениться значит нет.
dnox
bismigalis
часть этого тупла может измениться значит нет.
Ок. Поправьте, если я не прав:
Кортеж, по идее, содержит ссылки на объекты. Его неизменяемость заключается в том, что после создания мы не можем поменять эти ссылки. Но, у нас нет гарантии, что по одной из ссылок не лежит изменяемый объект. При создании ключа в словаре хэш высчитывается не на основе элементов кортежа (ссылок) а на основе самих объектов, лежащих по ссылкам. Т.о. если в кортеж попадает ссылка на изменяемый элемент, формально кортеж остается неизменяемым, но и ключом он уже быть не может. Я правильно все понял?
И отсюда второй вопрос: чем вызвано ограничение на подсчет хэша от изменяемого объекта?
wbt
Python 2.7.5+ (default, Sep 17 2013, 15:31:50) 
[GCC 4.8.1] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> a = [1,2,3]
>>> b = (a, 2, 3)
>>> b
([1, 2, 3], 2, 3)
>>> a = [1,2,5]
>>> b
([1, 2, 3], 2, 3)
>>> a
[1, 2, 5]
>>> id(a)
140342853651704
>>> id(b[0])
140342853581136

хм…

>>> a = [1,2,3]
>>> b = (a,2,3)
>>> id(a)
140342853651704
>>> id(b[0])
140342853651704

Судя по всему, в случае опасности, ссылка отщепляется.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB