Уведомления

Группа в Telegram: @pythonsu

#1 Окт. 3, 2013 14:23:44

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

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

dnox
ограничение на подсчет хэша от изменяемого объекта?
где такое ограничение?

нельзя делать ключ из изменяемой структуры, ибо иначе хеш может изменится и не будет найдено значение. как иначе это может проконтролировать интерпретатор?

Отредактировано bismigalis (Окт. 3, 2013 14:36:33)

Офлайн

#2 Окт. 3, 2013 14:30:45

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

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

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

Это не совсем корректный пример. Тут (как я все это вижу) происходит следующее: после создания кортежа у нас получается 2 переменные, хранящие ссылки на список. Это a и
b[0]
в этот момент имеют один и тот же id. После присваивания
a = [1,2,5]
создается новый список с новым id и переменная a затирается новой ссылкой. При этом b остается все той же старой ссылкой на
[1,2,5]
.

Если сделать так:
>>> a = [1,2,3]
>>> b = (a, 2, 3)
>>> b
([1, 2, 3], 2, 3)
>>> a[0] = 156
>>> b
([156, 2, 3], 2, 3)
>>> a
[156, 2, 5]
>>> id(a)
140342853651704
>>> id(b[0])
140342853651704
то и первый элемент изменится, и ссылка останется.

Отредактировано dnox (Окт. 3, 2013 14:32:45)

Офлайн

#3 Окт. 3, 2013 14:34:54

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

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

bismigalis
где такое ограничение?

Вот:
>>> hash([1,2,3])
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'list'

bismigalis
нельзя делать ключ из изменяемой структуры, ибо иначе хеш изменится и не будет найдено значение. как иначе это может проконтролировать интерпретатор?

Хэш же можно брать на основе id, который остается постоянным.

Офлайн

#4 Окт. 3, 2013 14:40:20

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

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

хеш можно брать от чего угодно

hash() это что единственная функция для вычисления хеша во вселенной. это спец функция для питона

Офлайн

#5 Окт. 3, 2013 14:44:58

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

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

bismigalis
хеш можно брать от чего угодно

hash() это что единственная функция для вычисления хеша во вселенной. это спец функция для питона

Ну, вопрос был про конкретную хэш-функцию питона. Что мешает в питоне брать хэш от того же id изменяемого объекта (который не меняется), тем самым позволяя делать ключом словаря изменяемые объекты?

Офлайн

#6 Окт. 3, 2013 14:58:36

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

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

какой смысл делать ключом изменяемые объекты?

hash() это не дженерал пёрпес hash-функция, а для вычисления уникального значения для объекта который может быть ключом в дикте, список не может быть, поэтому для него не вычисляют а выдают ошибку

Офлайн

#7 Окт. 3, 2013 15:07:19

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

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

bismigalis
какой смысл делать ключом изменяемые объекты?

hash() это не дженерал пёрпес hash-функция, а для вычисления уникального значения для объекта который может быть ключом в дикте, список не может быть, поэтому для него не вычисляют а выдают ошибку


То есть: изменяемый объект не может быть ключом словаря, потому что от него не считается функция hash(). А это, в свою очередь, просто потому, что так задумано? Я все правильно понял?

Офлайн

#8 Окт. 3, 2013 15:33:33

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

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

да, это намерено
таким образом разработчики питона избавляют нас от лишнего секса

в clоjure вообще все типы неизменяемые, по слухам у них там вообще никакого секса

Отредактировано bismigalis (Окт. 3, 2013 15:56:28)

Офлайн

#9 Окт. 3, 2013 16:19:20

agalen
От:
Зарегистрирован: 2011-03-23
Сообщения: 185
Репутация: +  17  -
Профиль   Отправить e-mail  

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

dnox
Что мешает в питоне брать хэш от того же id изменяемого объекта
По id вычислять хэш нельзя, т.к. разные объекты могут быть равны и у них должен быть одинаковый хэш.
>>> hash(1) == hash(1.0)
True
>>> hash(u"abc") == hash("abc")
True
По сути, id реализован как адрес объекта в памяти. У одинаковых объектов может отличаться.
>>> id( (1,2) )
45134032
>>> id( (1,2) )
45135592
>>> id( (1,2) )
45135512
>>> id( (1,2) )
45137232



Офлайн

#10 Окт. 3, 2013 19:04:49

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

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

bismigalis
по слухам у них там вообще никакого секса
это прискорбно(

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version