当Python解释器处理.py文件时,它是否与处理单个语句不同?

Abi*_*fly 6 python python-2.7

运行:

a = 257
b = 257
print id(a) == id(b)
Run Code Online (Sandbox Code Playgroud)

结果是:

同样的声明 在此输入图像描述

相同的陈述但相反的结果.为什么?

bak*_*kal 10

将代码test.py解析在一起,这比在解释器中作为单独语句解析的代码更可优化

当你将它放入test.py作为一个整体运行时,字节码编译器有更好的机会分析文字的使用并优化它们.(因此你得到ab指向同一个地方)

而不是在解释器中运行单独的语句(单独解析)时(我认为它只通过预分配优化到256而不是257)

在解释器中使用它来查看单独语句的效果:

>>> a, b = 257, 257      # or if you prefer: a = 257; b = 257
>>> print a is b
True

>>> a = 257
>>> b = 257
>>> print a is b
False
Run Code Online (Sandbox Code Playgroud)

在interperter中定义一个函数也可以改变它来分析和优化使用的文字

>>> def test():
...     a = 257
...     b = 257
...     print a is b
... 
>>> test()
True
Run Code Online (Sandbox Code Playgroud)

此优化不仅限于整数,也适用于浮点数(浮点数不受缓存类似[-5, 256]范围内的整数)

>>> def test():
...     pi = 3.14
...     x = 3.14
...     return x is pi
... 
>>> test()
True

# As opposed to separate statements:
>>> pi = 3.14
>>> x = 3.14
>>> x is pi
False
Run Code Online (Sandbox Code Playgroud)

查看字节代码,看它确实重用了相同的常量

>>> dis.dis(test)
  2           0 LOAD_CONST               1 (3.14)
              3 STORE_FAST               0 (pi)

  3           6 LOAD_CONST               1 (3.14) <-- Same constant 1 reused
              9 STORE_FAST               1 (x)

  4          12 LOAD_FAST                1 (x)
             15 LOAD_FAST                0 (pi)
             18 COMPARE_OP               8 (is)
             21 RETURN_VALUE  
Run Code Online (Sandbox Code Playgroud)