Kon*_*app 1 python compilation reference
在Python(更具体地说是Python 3.x)中,如果我说x = x,在低级别对x可变(如list)的引用或对不可变(如int)的引用,会发生什么?编译器是否只是忽略了这些废话?
更具体地说,如果我们有以下情况,编译器会做什么:
class A:
def __init__(self):
self.a = self.init_a()
def init_a(self):
self.a = some_value
"""
do stuff with self.a here
"""
return self.a
Run Code Online (Sandbox Code Playgroud)
对于那些没有注意到的人,self.a通过函数有效地分配给自己init_a(self).
我知道class A上面的这个案例看起来很傻,但是我试图通过清楚地初始化__init__(self)函数内部的所有成员变量来保持我的代码清晰可读(在我实现的另一个类中).我只想知道编译器是否优化了这一步,或者它是否在任何情况下执行某些操作,即使该语句没有产生任何结果(我猜它会被优化掉,但我想成为当然 - 你永远不知道).
from dis import dis
def foo():
x = 1
x = x
dis(foo)
Run Code Online (Sandbox Code Playgroud)
结果:
4 0 LOAD_CONST 1 (1)
3 STORE_FAST 0 (x)
5 6 LOAD_FAST 0 (x)
9 STORE_FAST 0 (x)
12 LOAD_CONST 0 (None)
15 RETURN_VALUE
Run Code Online (Sandbox Code Playgroud)
这表明即使在最微不足道的情况下,x = x也没有进行优化(在CPython中,这dis是为了什么).