Alo*_*nbs 9 python integer pycharm python-idle python-3.x
我刚刚读到了关于'运算符'的意外结果,因为Python缓存数介于-5到256之间.
这里讨论了这个问题: "是"运算符在整数上出乎意料地行为
当我运行其中一个示例时,我在Python Idle和Python IDE之间得到了不同的结果(我正在使用Jetbrains Pycharm专业版 - 5.0.4).
使用Python IDLE时,结果如下:
a = 1000
b = 1000
print (a is b) # prints False
Run Code Online (Sandbox Code Playgroud)
当使用Pycharm 5.0.4时,这是结果:
a = 1000
b = 1000
print (a is b) # prints True
Run Code Online (Sandbox Code Playgroud)
怎么会这样?我已经重新检查了,我的项目的Python-Interpreter在两种情况下完全相同(都是Python 3.5.1).不确定这是否是我做错了,我希望有人能解释一下.
编辑:
我知道'a'是'b'== true if if id(a)== id(b),并且您可以像评论中提到的那样检查它.也许我应该更清楚,我不明白的是IDE怎么会有不同的行为?我想(并请,请纠正我,因为我似乎错了)IDE只是一个使用外部编译器/解释器的用户友好环境,这就是为什么这些独立于那些IDE(例如,pycharm支持)不仅是Python,而且我可以使用C编译器或Java等运行Eclipse(所有这些都不是IDE的一部分).
谢谢,Alon.
这是因为LOAD_CONST字节码的工作方式:
压
co_consts[consti]入堆栈。
由于整数存储为常数,然后分配到在同样的情况下相同的整数将产生完全相同的结果,我们可以看到,arguement来LOAD_CONST是0为a和b:
>>> import dis
>>> dis.dis("a = 1000 ; b = 1000")
1 0 LOAD_CONST 0 (1000)
3 STORE_NAME 0 (a)
6 LOAD_CONST 0 (1000)
9 STORE_NAME 1 (b)
12 LOAD_CONST 1 (None)
15 RETURN_VALUE
# ^ this is the argument
Run Code Online (Sandbox Code Playgroud)
在交互式会话中,每个命令都是单独编译的(以便它们可以单独执行),因此常量会有所不同:
>>> code1 = compile("a = 1000","<dummy file>","exec")
>>> code2 = compile("a = 1000","<dummy file>","exec")
>>> code1.co_consts, code2.co_consts
((1000, None), (1000, None))
>>> code1.co_consts[0] is code2.co_consts[0]
False
Run Code Online (Sandbox Code Playgroud)
同样,函数中的常量始终相同,但与其他函数中的常量不同:
def f():
return 1000
def g():
return 1000 #different code object!!
#these all work
assert f() is f()
assert g() is g()
assert f() is not g()
assert f() is not 1000 and g() is not 1000
Run Code Online (Sandbox Code Playgroud)
另请注意,正如@AniMenon指出的那样,从 -5 到 256 的数字是用于优化的单例,因此该范围内的数字不适用。