[英]Arbitrary scope nesting in Python
以下python示例来自此处 :
def f1():
x = 99
def f2():
def f3():
print(x)
print('f3')
f3()
f2()
f1()
这是输出:
99
f3
为什么输出不以下?
99
f3 # from f1()
99
f3 # from f3()
99
f3 # from f2()
您应该考虑Python作用域规则(LEGB)。 PYthon将寻找:
L
:局部变量
E
:封闭变量(在封闭函数中定义的变量)
G
:全局变量(零缩进级别的变量)
B
:内置变量
程序如何执行:
f1
被定义,然后f1
被称为 f1
, x
取值为99
,然后定义f2
,然后调用f2
。 f2
,先定义f3
,然后再调用f3
。 f3
,将打印x
,并且由于f3
没有局部x
,因此它将使用f1
局部的enclosing
x。 然后,使用print
功能精确打印字符串"f3"
。 f3
返回, f2
返回, f1
返回,程序完成。 考虑一下代码:
def f():
print(123)
执行时不会打印任何内容。 def
仅定义函数-在执行f()
之前不会执行。
同样,您的示例仅定义内部函数,但是只有在调用f3
时, print
语句才会执行。
这是因为解开代码后,它简化为:
x = 99
print(x)
print('f3')
这是展开的顺序:
def f1():
x = 99
def f2():
def f3():
print(x)
print('f3')
f3()
f2()
f1()
变成
x = 99
def f2():
def f3():
print(x)
print('f3')
f3()
f2()
变成
x = 99
def f3():
print(x)
print('f3')
f3()
变成
x = 99
print(x)
print('f3')
然后执行。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.