(Python)使用 `is` 时,`2` 和 `[2]` 有什么不同?

3
a = 2
b = 2
print(b is a)
a = [2]
b = [2]
print(b is a)

第一个print返回True,第二个print返回False。为什么会这样?

@mgilson 谢谢! - inspd
2个回答

4
在Python中,小整数被缓存以提高效率。
因此,b is aTrue,因为它们在内存中具有相同的位置。 is检查对象标识。如果要检查相等性,请使用==,除了None,在这种情况下似乎有普遍共识使用is
>>> a = 2
>>> b = 2
>>> id(a)
1835382448
>>> id(b)
1835382448

为什么当ba都被赋值为[2]时,它们在内存中的位置不同?它们不是指向同一个对象吗?请原谅我的有限知识。 - inspd
为什么当b和a都被赋值为[2]时,它们在内存中的位置不同呢?这是因为每次写入[2]时,都会创建一个新的数组。你并没有重用现有的数组。 - Michael Geary

0

is 检查对象标识(列表 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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接