Уведомления

Группа в Telegram: @pythonsu

#1 Окт. 3, 2013 09:50:19

dnox
Зарегистрирован: 2012-12-17
Сообщения: 18
Репутация: +  0  -
Профиль   Отправить e-mail  

Изменяемые/неизменяемые типы данных

Всем доброго дня. Всегда думал, что основная разница между изменяемыми и неизменяемыми типами - то что они соответственно unhashable и hashable. Но недавно узнал, что это не совсем так. Так вот возник вопрос, с какой целью идет разделение на изменяемые и неизменяемые типы? В частности, на примере tuple и list. Я, конечно, предполагаю что tuple лучше использовать для каких-то констант/данных, изменение которых нежелательно, но хотелось бы более развернутого ответа.
Ну и второй вопрос: где можно почитать про механизм подсчета хэша объекта-ключа при создании словаря?

Офлайн

#2 Окт. 3, 2013 10:34:24

Singularity
Зарегистрирован: 2011-07-28
Сообщения: 1387
Репутация: +  75  -
Профиль   Отправить e-mail  

Изменяемые/неизменяемые типы данных

dnox
Ну и второй вопрос: где можно почитать про механизм подсчета хэша объекта-ключа при создании словаря?
http://hg.python.org/cpython/file/1cb0c05d71af/Objects/dictobject.c

Офлайн

#3 Окт. 3, 2013 13:15:00

dnox
Зарегистрирован: 2012-12-17
Сообщения: 18
Репутация: +  0  -
Профиль   Отправить e-mail  

Изменяемые/неизменяемые типы данных

Singularity
http://hg.python.org/cpython/file/1cb0c05d71af/Objects/dictobject.c

Спасибо. Пришлось полазить по ссылкам, но то, что нужно я нашел.
Вопрос по типам еще стоит)

Офлайн

#4 Окт. 3, 2013 13:29:40

bismigalis
Зарегистрирован: 2010-10-02
Сообщения: 449
Репутация: +  47  -
Профиль   Отправить e-mail  

Изменяемые/неизменяемые типы данных

основное отличие, неизменяемые могут быть ключом в словаре

Офлайн

#5 Окт. 3, 2013 13:47:22

dnox
Зарегистрирован: 2012-12-17
Сообщения: 18
Репутация: +  0  -
Профиль   Отправить e-mail  

Изменяемые/неизменяемые типы данных

bismigalis
основное отличие, неизменяемые могут быть ключом в словаре
Я тоже так думал, на этом и попался.
([1,2,3], 4 , 5)
- неизменяемый tuple, но ключом в словаре он быть не может.

Отредактировано dnox (Окт. 3, 2013 13:47:57)

Офлайн

#6 Окт. 3, 2013 13:53:30

bismigalis
Зарегистрирован: 2010-10-02
Сообщения: 449
Репутация: +  47  -
Профиль   Отправить e-mail  

Изменяемые/неизменяемые типы данных

dnox
([1,2,3], 4 , 5)
а это что неизменяемая структура?

Отредактировано bismigalis (Окт. 3, 2013 13:54:00)

Офлайн

#7 Окт. 3, 2013 13:58:02

dnox
Зарегистрирован: 2012-12-17
Сообщения: 18
Репутация: +  0  -
Профиль   Отправить e-mail  

Изменяемые/неизменяемые типы данных

bismigalis
а это что неизменяемая структура?
Ну, так как это все еще tuple, то я предполагаю, что да.

Отредактировано dnox (Окт. 3, 2013 13:58:49)

Офлайн

#8 Окт. 3, 2013 14:00:33

bismigalis
Зарегистрирован: 2010-10-02
Сообщения: 449
Репутация: +  47  -
Профиль   Отправить e-mail  

Изменяемые/неизменяемые типы данных

часть этого тупла может измениться значит нет.

Офлайн

#9 Окт. 3, 2013 14:10:52

dnox
Зарегистрирован: 2012-12-17
Сообщения: 18
Репутация: +  0  -
Профиль   Отправить e-mail  

Изменяемые/неизменяемые типы данных

bismigalis
часть этого тупла может измениться значит нет.
Ок. Поправьте, если я не прав:
Кортеж, по идее, содержит ссылки на объекты. Его неизменяемость заключается в том, что после создания мы не можем поменять эти ссылки. Но, у нас нет гарантии, что по одной из ссылок не лежит изменяемый объект. При создании ключа в словаре хэш высчитывается не на основе элементов кортежа (ссылок) а на основе самих объектов, лежащих по ссылкам. Т.о. если в кортеж попадает ссылка на изменяемый элемент, формально кортеж остается неизменяемым, но и ключом он уже быть не может. Я правильно все понял?
И отсюда второй вопрос: чем вызвано ограничение на подсчет хэша от изменяемого объекта?

Офлайн

#10 Окт. 3, 2013 14:20:29

wbt
Зарегистрирован: 2013-08-13
Сообщения: 143
Репутация: +  6  -
Профиль   Отправить e-mail  

Изменяемые/неизменяемые типы данных

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

Судя по всему, в случае опасности, ссылка отщепляется.



Бейсик - не порок, Гвидо - не пророк

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version