可能重复:
Python “is” operator behaves unexpectedly with integers
Why (0-6) is -6 = False?
>>> (0 - 10) is -10
False
>>> (0 - 5) is -5
True
任何人都可以解释一下,我在一个案例中得到的是假,而在另一个案例中我得到的是同样的操纵......
更奇怪......
>>> (0 - 10) is (0 - 10)
False
答案 0 :(得分:3)
不要使用is
进行相等性测试 - 它是身份运算符,两个相等的对象不一定相同(即,驻留在计算机内存中的相同地址下)。一些小整数可以被缓存和重用但不是全部,这就是为什么你在这里看到不同的结果。
此外,此行为与实现有关,因此您不能总是依赖于此。
答案 1 :(得分:2)
来自doc:
当前实现为-5到256之间的所有整数保留一个整数对象数组,当您在该范围内创建一个int时,实际上只返回对现有对象的引用。因此应该可以更改值1.我怀疑在这种情况下Python的行为是未定义的。 : - )
根据我的经验:在我的Python2.7中,(0 + x) is x
在True
和x
之间-5
返回+256
,其他地方False
答案 2 :(得分:1)
您正在创建int
的实例,并希望它们都是同一个对象。对于大多数其他对象而言,这通常不起作用,因此,您可能会感到惊讶的是,您完全得到True
。
原因是Python在启动时创建了一堆经常使用的整数对象,只要它们被调用就可以重用。这可以解决,因为int
是不可变的,但只是一种优化。
答案 3 :(得分:1)
is
运算符将确定两个对象是否具有相同的标识(在低级术语中,它们的表示是否在内存中的同一地址)。
a = object()
a is a
True
在Python中,数字就像其他任何对象一样,所以is
是否有效将取决于你如何创建它们。
a = 0
a is a
True
你的代码在一个案例中而不是在另一个案例中工作的原因是Python interns 小整数;也就是说,不是为-5
创建一个新的数字对象,而是保留一个小整数的缓存,并为您提供适当的数字对象。另一方面,在你的情况下,-10
没有被实现,因此Python每次都必须创建一个新的数字对象。
其他被拦截的对象包括短字符串(包括单字符字符串),以及True
和`False。
你不应该依赖实习;而不是is
,您应该使用==
运算符。
答案 4 :(得分:0)
可能有一些实现优化可能会重复使用相同的数字对象。
我会说这就是你有时会得到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