сравнить список (целых чисел), используя id () в Python - PullRequest
1 голос
/ 03 ноября 2011

Я обнаружил странную вещь в Python, когда попытался сравнить списки, составленные из целых чисел.

Например:

In [35]: id(range(1,5)),id(range(1,15)),id(range(16,0,-1))
Out[35]: (155687404, 155687404, 155687404)

1: Почему их значения id () одинаковы? И как они могут быть одинаковыми, так как они выглядят по-разному?

Q2: Как я могу сравнить списки целых чисел по значениям id ()?

Q3: Чтобы быть более любознательным, как вычисляется значение id () в Python?

Ответы [ 3 ]

7 голосов
/ 03 ноября 2011

Непосредственно из документа Python:

Return the “identity” of an object. This is an integer (or long integer) 
which is guaranteed to be unique and constant for this object during its lifetime. 
Two objects with non-overlapping lifetimes may have the same id() value.

Вы можете получить хэш md5 для сравнения этих объектов:

import md5
>>> md5.new(str(range(1,5))).hexdigest()
'd5397571a7f9c05bd58bed77f9dbe8f0'
>>> md5.new(str(range(1,15))).hexdigest()
'000b3ca7f2653a13cdb5b96f21c2ba4d'
6 голосов
/ 03 ноября 2011

Идентификатор как-то соответствует расположению памяти в объекте. Вы не используете созданные объекты, поэтому они автоматически удаляются. Когда вы создаете следующий, он просто использует тот же адрес. Таким образом, у вас один и тот же идентификатор, но это разные объекты.

Попробуйте:

>>> x,y,z = range(1,5),range(1,15),range(16,0,-1)
>>> id(x),id(y),id(z)
(36015480, 36015760, 36005368)
5 голосов
/ 03 ноября 2011

Это потому, что сразу после вызова id () ваши диапазоны выходят за рамки - их идентификаторы затем используются повторно.

Если они все еще были доступны, то их идентификатор будет другим.Попробуйте это:

>>> (a,b,c)=(range(1,5),range(1,15),range(16,0,-1))
>>> (id(a),id(b),id(c))
(3078445292L, 3078088588L, 3078090188L)
...