考虑下面的代码,为什么我不需要将 x 传递给 Y?
class X:
def __init__(self):
self.a = 1
self.b = 2
self.c = 3
class Y:
def A(self):
print(x.a,x.b,x.c)
x = X()
y = Y()
y.A()
感谢您的最佳答案,他们确实帮助我了解了问题所在,即对变量范围的误解。我希望我可以选择两者作为正确答案,因为它们以自己的方式具有启发性。
当python编译一个def
进入一个函数时,它会尝试确定您引用的内容是否是本地的,如果不是,那么您引用的一定是全局的。例如:
def f():
print(x)
嗯,你还没有定义x
范围内f
,所以你必须指的是全局的。
这就是上面代码中发生的所有事情。你还没有定义x
范围内A
, so x
必须是全局的。碰巧,您定义了全局:
x = X()
在你调用它之前:
y = Y()
y.A()
所以一切顺利。
如果你想“嗯,我不确定我是否相信你,roippi”,只需看看字节码:
dis.dis(Y.A)
3 0 LOAD_GLOBAL 0 (print)
3 LOAD_GLOBAL 1 (x) # aha
6 LOAD_ATTR 2 (a)
9 LOAD_GLOBAL 1 (x) # aha!
12 LOAD_ATTR 3 (b)
15 LOAD_GLOBAL 1 (x) # aha!!
18 LOAD_ATTR 4 (c)
21 CALL_FUNCTION 3 (3 positional, 0 keyword pair)
24 POP_TOP
25 LOAD_CONST 0 (None)
28 RETURN_VALUE
aha.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)