在python中进行减法操作时获得奇怪的结果

时间:2012-07-17 07:01:24

标签: python

  

可能重复:
  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

5 个答案:

答案 0 :(得分:3)

不要使用is进行相等性测试 - 它是身份运算符,两个相等的对象不一定相同(即,驻留在计算机内存中的相同地址下)。一些小整数可以被缓存和重用但不是全部,这就是为什么你在这里看到不同的结果。

此外,此行为与实现有关,因此您不能总是依赖于此。

答案 1 :(得分:2)

来自doc

当前实现为-5到256之间的所有整数保留一个整数对象数组,当您在该范围内创建一个int时,实际上只返回对现有对象的引用。因此应该可以更改值1.我怀疑在这种情况下Python的行为是未定义的。 : - )

根据我的经验:在我的Python2.7中,(0 + x) is xTruex之间-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