如果我说x = x会怎么样?(在较低的编译器级别)

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)函数内部的所有成员变量来保持我的代码清晰可读(在我实现的另一个类中).我只想知道编译器是否优化了这一步,或者它是否在任何情况下执行某些操作,即使该语句没有产生任何结果(我猜它会被优化掉,但我想成为当然 - 你永远不知道).

Ale*_*all 5

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是为了什么).