在 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
对于那些没有注意到的人,self.a 实际上是通过函数 init_a(self) 分配给它自己的。
我知道上面的 class A 这种情况看起来很愚蠢,但我试图通过在 __init__(self) 函数(在我真正实现的另一个类中)。我只是想知道编译器是否优化了那一步,或者它是否在任何情况下都做了一些操作,即使该语句没有产生任何结果(我猜它被优化掉了,但我想成为当然 - 你永远不会知道)。
请您参考如下方法:
from dis import dis
def foo():
x = 1
x = x
dis(foo)
结果:
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
这表明即使在最微不足道的情况下,x = x 也没有被优化掉(在 CPython 中,这就是 dis 的用途)。
