Как проверить, ссылаются ли две переменные на один и тот же объект?
x = ['a', 'b', 'c']
y = x # x and y reference the same object
z = ['a', 'b', 'c'] # x and z reference different objects
Как проверить, ссылаются ли две переменные на один и тот же объект?
x = ['a', 'b', 'c']
y = x # x and y reference the same object
z = ['a', 'b', 'c'] # x and z reference different objects
Вот для чего is
: x is y
возвращает True
, если x
и y
являются одним и тем же объектом.
y is x
будет True
, y is z
будет False
.
В то время как два правильных решения 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
Вы также можете использовать 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)
Мне очень нравится иметь визуальную обратную связь, поэтому я иногда просто открываю http://www.pythontutor.com/visualize.html#mode=edit, чтобы посмотреть, как распределяется память и что ссылается на что.
Добавлен этот потрясающий gif, так как этот ответ о визуализации.
Это из docs.python.org: "Каждый объект имеет идентичность, тип и значение. Идентификация объекта никогда не изменяется после его создания; вы можете думать об этом как об адресе объектов в памяти. Оператор is сравнивает идентичность двух объектов; функция id() возвращает целое число, представляющее его идентичность. "
По-видимому, каждый раз, когда вы меняете значение, объект воссоздается, как показано изменением идентичности. Строка x = 3, за которой следует строка x = 3.14, не дает ошибок и дает различные идентификаторы, типы и значения для x.