>>> (0 - 10) is -10
False
>>> (0 - 5) is -5
True
任何人都可以解释一下,我如何在一种情况下得到 False,在另一种情况下得到 True 来进行相同的操作......
还有点诡异...
>>> (0 - 10) is (0 - 10)
False
>>> (0 - 10) is -10
False
>>> (0 - 5) is -5
True
任何人都可以解释一下,我如何在一种情况下得到 False,在另一种情况下得到 True 来进行相同的操作......
还有点诡异...
>>> (0 - 10) is (0 - 10)
False
不要is
用于相等测试 - 它是身份运算符,两个相等的对象不一定相同(即位于计算机内存中的同一地址下)。一些小整数可能会被缓存和重用,但不是全部,这就是您在这里看到不同结果的原因。
此外,此行为依赖于实现,因此您不能始终依赖这种情况。
从文档:
当前的实现为 -5 到 256 之间的所有整数保留一个整数对象数组,当您在该范围内创建一个 int 时,您实际上只是取回了对现有对象的引用。所以应该可以改变 1 的值。我怀疑 Python 在这种情况下的行为是未定义的。:-)
根据我的经验:在我的 Python2.7 中,在其他地方(0 + x) is x
返回between and 。True
x
-5
+256
False
您正在创建实例int
并期望它们都是同一个对象。对于大多数其他对象,这通常根本不起作用,所以也许你会感到惊讶True
。
这样做的原因是 Python 在启动时会创建一堆经常使用的整数对象,只要它们被调用就可以重用它们。这行得通,因为int
它是不可变的,但只是一种优化。
运算符将is
确定两个对象是否具有相同的标识(在低级术语中,它们的表示是否位于内存中的相同地址)。
a = object()
a is a
True
在 Python 中,数字和其他任何东西一样都是对象,因此是否is
有效取决于您如何创建它们。
a = 0
a is a
True
您的代码在一种情况下工作而不在另一种情况下工作的原因是 Python实习小整数;也就是说,与其为它创建一个新的数字对象,不如为-5
它保留一个小整数的缓存并为您提供适当的数字对象。另一方面,在您的情况下-10
没有实习,因此 Python 每次都必须创建一个新的数字对象。
其他被实习的对象包括短字符串(包括单字符串)True
和 `False。
你不应该依赖实习;而不是is
你应该使用==
运算符。
可能有一些实现优化可以重用相同的数字对象。
我会说这就是为什么你True
有时会得到。
$ python3
Python 3.2.3 (default, May 3 2012, 15:51:42)
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> id(3)
9357472
>>> id(3)
9357472
我认为您正在寻找的平等检查==
:
>>> 3 is 3 # Result may depend on implementation details
True
>>> 3 == 3 # Always True
True