Python交互式终端结果与脚本结果不一致



交互式终端结果:

In [11]: a=1111111111111111111111111111111111111111111111111111
In [12]: b=1111111111111111111111111111111111111111111111111111
In [13]: a is b
Out[13]: False

脚本结果:

# overflow in ~ [13:55:16]
» python -c "a=1111111111111111111111111111111111111111111111111111;b=1111111111111111111111111111111111111111111111111111; print a is b"
True

Emmmmm。我认为结果应该是假的。。。因为1111111111111111111111111111111111111111111111111111256大得多

我知道is不是平等测试。但是,当Python声明一个变量(不可变类型((如b = 1(时,它会发现该对象是否已在旧对象(a = 1(中声明。如果声明了对象(a = 1(,则变量将直接指向旧对象,并且不会应用于新的内存空间。(a is bTrue(

In [2]: a=1
In [3]: b=1
In [4]: a is b
Out[4]: True

emmm。正确的

至于"is"运算符对整数的行为出乎意料。它解释了is的用法,但我仍然不明白为什么这两种方法会导致不同的结果(

也许,它只是取决于Python的实现和运行时环境。

这实际上取决于您在寻找什么。is用于身份测试,==用于平等测试。不要依赖is来检查是否相等。

Equality指的是对象的值,而identity指的是指向同一对象id的指针。例如,如果您在终端中运行此操作,is将返回False:

a = 1111
b = int('1111')
print(a == b)
>>True
print(a is b)
>>False

不建议假设使用is而不是用于身份测试,其行为取决于Python实现和运行时环境。我还怀疑,因为Python是如何在整数重复的地方读取整数的。例如:

a = 257
b = 257
a is b
>>False

来自文档:

返回值:新引用。创建一个具有值的新整数对象ival。

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

对于优化,短整数实际上只是指回同一个对象,这也应该适用。如果您将值中的单个数字(不重复(更改为高于256,它将返回False

这很有趣。

Python 3.7.1 (default, Oct 22 2018, 11:21:55) 
Type 'copyright', 'credits' or 'license' for more information
IPython 7.1.1 -- An enhanced Interactive Python. Type '?' for help.
In [1]: a=1111111111111111111111111111111111111111111111111111                                                                
In [2]: b=1111111111111111111111111111111111111111111111111111
In [3]: id(a),id(b)                                                                                                           
Out[3]: (139945897647488, 139945897647536)
In [4]: len(str(a))                                                                                                           
Out[4]: 52

最新更新