交互式终端结果:
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 ...因为1111111111111111111111111111111111111111111111111111
比256
我知道is
不是平等测试。但是,当Python声明一个变量(不可变类型),例如b = 1
时,它将找出该对象是否已在旧对象(a = 1
)中声明。如果声明了对象(a = 1
),则变量将直接指向旧对象,并且将不适用于新的内存空间。(a is b
为True
)
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实现和运行时环境。
答案 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