Подтвердить что ты не робот

Сравните, если две переменные ссылаются на один и тот же объект в python

Как проверить, ссылаются ли две переменные на один и тот же объект?

x = ['a', 'b', 'c']
y = x                 # x and y reference the same object
z = ['a', 'b', 'c']   # x and z reference different objects
4b9b3361

Ответ 1

Вот для чего is: x is y возвращает True, если x и y являются одним и тем же объектом.

Ответ 2

y is x будет True, y is z будет False.

Ответ 3

В то время как два правильных решения x is z и id(x) == id(z) я хочу указать на детали реализации python. Python хранит целые числа в виде объектов, в качестве оптимизации он генерирует кучу маленьких целых чисел в начале (-5 - 256) и указывает на КАЖДУЮ переменную, содержащую целое число с небольшим значением, на эти предварительно инициализированные объекты. Больше информации

Это означает, что для целочисленных объектов, инициализированных одинаковыми небольшими числами (от -5 до 256), проверка, являются ли два объекта одинаковыми, вернет true (ON C-Pyhon, насколько я знаю, это деталь реализации), тогда как для большее число возвращает true только если один объект инициализируется от другого.

> i = 13
> j = 13
> i is j
True

> a = 280
> b = 280
> a is b
False

> a = b
> a
280
> a is b
True

Ответ 4

Вы также можете использовать id(), чтобы проверить, к какому уникальному объекту относится каждое имя переменной.

In [1]: x1, x2 = 'foo', 'foo'

In [2]: x1 == x2
Out[2]: True

In [3]: id(x1), id(x2)
Out[3]: (4509849040, 4509849040)

In [4]: x2 = 'foobar'[0:3]

In [5]: x2
Out[5]: 'foo'

In [6]: x1 == x2
Out[6]: True

In [7]: x1 is x2
Out[7]: False

In [8]: id(x1), id(x2)
Out[8]: (4509849040, 4526514944)

Ответ 5

Мне очень нравится иметь визуальную обратную связь, поэтому я иногда просто открываю http://www.pythontutor.com/visualize.html#mode=edit, чтобы посмотреть, как распределяется память и что ссылается на что.

введите описание изображения здесь

Добавлен этот потрясающий gif, так как этот ответ о визуализации.

Ответ 6

Это из docs.python.org: "Каждый объект имеет идентичность, тип и значение. Идентификация объекта никогда не изменяется после его создания; вы можете думать об этом как об адресе объектов в памяти. Оператор is сравнивает идентичность двух объектов; функция id() возвращает целое число, представляющее его идентичность. "

По-видимому, каждый раз, когда вы меняете значение, объект воссоздается, как показано изменением идентичности. Строка x = 3, за которой следует строка x = 3.14, не дает ошибок и дает различные идентификаторы, типы и значения для x.