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

时间:2018-11-23 06:08:40

标签: python

交互式终端结果:

In [11]: a=1111111111111111111111111111111111111111111111111111

In [12]: b=1111111111111111111111111111111111111111111111111111

In [13]: a is b
Out[13]: False

脚本结果:

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

True

Emmmmmm。我认为结果应该为False ...因为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

emmmm。对吧?

关于“is” operator behaves unexpectedly with integers。它解释了is的用法,但我仍然不明白为什么这两种方法会导致不同的结果。 :(

也许,这仅取决于Python实现和运行时环境。

3 个答案:

答案 0 :(得分:1)

这实际上取决于您要查找的内容。 is用于身份测试,==用于相等性测试。不要依靠is来检查是否相等。

平等是指对象的值,而身份是指指向相同对象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

从文档中

  

返回值:新参考。用值创建一个新的整数对象   节日的。

     

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

为了进行优化,短整数实际上只是引用了同一对象,如果您更改了值256(未重复)中的单个数字,则这也应适用,它将返回False

答案 1 :(得分:0)

这很有趣。

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

答案 2 :(得分:0)

is通过比较引用的对象来查看操作数是否指向同一对象。

从文档中:is

The operators is and is not test for object identity: x is y is true if and only if x and y are the same object. x is not y yields the inverse truth value.

In [925]: a=1111111111111111111111111111111111111111111111111111

In [926]: b=1111111111111111111111111111111111111111111111111111

In [927]: a is b
Out[927]: False

In [929]: c = a

In [930]: a is c
Out[930]: True