本问题已经有最佳答案,请猛点这里访问。
Possible Duplicate:
Python is operator behaves unexpectedly with integers
Why (0-6) is -6 = False?
>>> (0 - 10) is -10
False
>>> (0 - 5) is -5
True
有人能解释一下我,在相同情况下,如何在一种情况下得到False,在另一种情况下得到True。
更奇怪...
>>> (0 - 10) is (0 - 10)
False
另请参见Python" is"运算符的行为异常
请勿使用is进行相等性测试-它是身份运算符,并且两个相等的对象不一定相同(即,位于计算机内存中的同一地址下)。可能会缓存和重用一些小整数,但并非全部都被缓存,这就是为什么您在这里看到不同结果的原因。
此外,此行为与实现有关,因此您不能总是这样。
从文档:
当前的实现为-5到256之间的所有整数保留一个整数对象数组,当您在该范围内创建int时,实际上实际上是返回对现有对象的引用。因此应该可以更改1的值。我怀疑在这种情况下Python的行为是不确定的。 :-)
根据我的经验:在我的Python2.7中,(0 + x) is x为x返回True,介于-5和+256之间,以及False在其他位置。
很好...不知道:)
is运算符将确定两个对象是否具有相同的标识(按低级术语,它们的表示形式是否在内存中位于相同的地址)。
a = object()
a is a
True
在Python中,数字就像其他对象一样是对象,因此is是否起作用取决于您如何创建它们。
a = 0
a is a
True
您的代码在一种情况下有效而在另一种情况下无效的原因是Python会实习小的整数;也就是说,它不会为-5创建新的数字对象,而是会保留小整数的缓存并为您提供适当的数字对象。另一方面,在您未设置-10的情况下,Python每次都必须创建一个新的数字对象。
被禁入的其他对象包括短字符串(包括单字符字符串)以及True和`False。
您不应该依赖实习。应该使用==运算符代替is。
您正在创建int的实例,并期望它们都是同一对象。对于大多数其他对象,这通常根本不起作用,因此,您完全得到True也许应该令人惊讶。
这样做的原因是Python在启动时会创建一堆经常使用的整数对象,可以在需要它们时重用它们。之所以可行,是因为int是不可变的,但这只是一种优化。
可能存在一些实现优化,可能会重用同一数字对象。
我会说这就是为什么有时会出现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