a = 2
b = 2
print(b is a)
a = [2]
b = [2]
print(b is a)
第一个
print
返回True
,第二个print
返回False
。为什么会这样?a = 2
b = 2
print(b is a)
a = [2]
b = [2]
print(b is a)
print
返回True
,第二个print
返回False
。为什么会这样?b is a
是True
,因为它们在内存中具有相同的位置。
is
检查对象标识。如果要检查相等性,请使用==
,除了None
,在这种情况下似乎有普遍共识使用is
。>>> a = 2
>>> b = 2
>>> id(a)
1835382448
>>> id(b)
1835382448
b
和a
都被赋值为[2]
时,它们在内存中的位置不同?它们不是指向同一个对象吗?请原谅我的有限知识。 - inspd[2]
时,它们在内存中的位置不同呢?这是因为每次写入[2]
时,都会创建一个新的数组。你并没有重用现有的数组。 - Michael Gearyis
检查对象标识(列表 a
是否与列表 b
是同一实例)。而 ==
比较值标识(变量 a
中存储的内容是否等同于变量 b
中存储的内容)
所以在你的情况下,[2]
是值,虽然变量 a
和变量 b
都存储了这个值,但它们不是同一个实例(你可以修改 a
,但 b
不会改变)
如果你添加另一个变量并将其指向 a
,你就可以看到这种行为:
Python 2.7.10 (default, Oct 23 2015, 19:19:21)
[GCC 4.2.1 Compatible Apple LLVM 7.0.0 (clang-700.0.59.5)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> a = [2]
>>> b = [2]
>>> a == b
True
>>> a is b
False
>>> c = a
>>> c == a
True
>>> c is a
True