1

可能重复:
Python“is”运算符对整数的行为异常
为什么(0-6)为-6 = False?

>>> (0 - 10) is -10
False
>>> (0 - 5) is -5
True

任何人都可以解释一下,我如何在一种情况下得到 False,在另一种情况下得到 True 来进行相同的操作......

还有点诡异...

>>> (0 - 10) is (0 - 10)
False
4

5 回答 5

3

不要is用于相等测试 - 它是身份运算符,两个相等的对象不一定相同(即位于计算机内存中的同一地址下)。一些小整数可能会被缓存和重用,但不是全部,这就是您在这里看到不同结果的原因。

此外,此行为依赖于实现,因此您不能始终依赖这种情况。

于 2012-07-17T07:03:40.783 回答
2

文档

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

根据我的经验:在我的 Python2.7 中,在其他地方(0 + x) is x返回between and 。Truex-5+256False

于 2012-07-17T07:06:37.277 回答
1

您正在创建实例int并期望它们都是同一个对象。对于大多数其他对象,这通常根本不起作用,所以也许你会感到惊讶True

这样做的原因是 Python 在启动时会创建一堆经常使用的整数对象,只要它们被调用就可以重用它们。这行得通,因为int它是不可变的,但只是一种优化。

于 2012-07-17T07:08:11.190 回答
1

运算符将is确定两个对象是否具有相同的标识(在低级术语中,它们的表示是否位于内存中的相同地址)。

a = object()
a is a
True

在 Python 中,数字和其他任何东西一样都是对象,因此是否is有效取决于您如何创建它们。

a = 0
a is a
True

您的代码在一种情况下工作而不在另一种情况下工作的原因是 Python实习小整数;也就是说,与其为它创建一个新的数字对象,不如为-5它保留一个小整数的缓存并为您提供适当的数字对象。另一方面,在您的情况下-10没有实习,因此 Python 每次都必须创建一个新的数字对象。

其他被实习的对象包括短字符串(包括单字符串)True和 `False。

你不应该依赖实习;而不是is你应该使用==运算符。

于 2012-07-17T07:08:36.727 回答
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
于 2012-07-17T07:12:29.930 回答