Найти - Пользователи
Полная версия: Изменяемые/неизменяемые типы данных
Начало » Python для новичков » Изменяемые/неизменяемые типы данных
1 2
bismigalis
dnox
ограничение на подсчет хэша от изменяемого объекта?
где такое ограничение?

нельзя делать ключ из изменяемой структуры, ибо иначе хеш может изменится и не будет найдено значение. как иначе это может проконтролировать интерпретатор?
dnox
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
bismigalis
где такое ограничение?

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

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

Хэш же можно брать на основе id, который остается постоянным.
bismigalis
хеш можно брать от чего угодно

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

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

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

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

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

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

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


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

в clоjure вообще все типы неизменяемые, по слухам у них там вообще никакого секса
agalen
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
Singularity
bismigalis
по слухам у них там вообще никакого секса
это прискорбно(
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