0

给定一个 Python 解释器(CPython、Jython 等),生成的字节码是确定性的吗?也就是说,如果我编译 2 个不同的脚本,它们仅在空格上有所不同,但在其他方面在语法上是等效的,那么所选的编译器会生成完全相同的字节码吗?

4

1 回答 1

6

目前尚不清楚您在寻找什么,确切地说。当然,从语法上讲,相同的代码将导致执行相同的指令。但即使是语法上等价的 python 文件也可以生成不同的.pyc缓存字节码文件。添加或删除换行符将导致不同的行偏移:

>>> import dis
>>> def foo():
...     # in the interpreter, comments will do the same job as newlines
...     baz
...     # extra newlines or comments push the bytecode offsets
...     return 42
... 
>>> def bar():
...     baz
...     return 42
... 
>>> dis.dis(foo)
  3           0 LOAD_GLOBAL              0 (baz)
              3 POP_TOP             

  5           4 LOAD_CONST               1 (42)
              7 RETURN_VALUE        
>>> dis.dis(bar)
  2           0 LOAD_GLOBAL              0 (baz)
              3 POP_TOP             

  3           4 LOAD_CONST               1 (42)
              7 RETURN_VALUE        

注意左列中的不同值;解释器的行为仍然完全相同,但偏移量不同。

字节码和偏移量可以分别访问,而解释器执行的内容相同:

>>> foo.__code__.co_lnotab
'\x00\x02\x04\x02'
>>> bar.__code__.co_lnotab
'\x00\x01\x04\x01'
>>> foo.__code__.co_code == bar.__code__.co_code
True
于 2013-10-16T21:02:51.810 回答