以下python示例来自here:
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()
答案 0 :(得分:2)
您应该考虑Python作用域规则(LEGB)。 PYthon将寻找:
L
:局部变量
E
:封闭变量(封闭函数中定义的变量)
G
:全局变量(零缩进级别的变量)
B
:内置变量
程序的执行方式:
f1
,然后调用f1
f1
时,x
取值为99
,然后定义f2
,然后调用f2
。f2
时,先定义f3
,然后再调用f3
。f3
时,将打印x
,并且由于x
中没有本地f3
,因此它将使用本地的enclosing
x到f1
。然后,您将使用"f3"
函数精确地打印字符串print
。f3
返回,f2
返回,f1
返回,程序结束。答案 1 :(得分:2)
考虑代码:
def f():
print(123)
在执行时不会打印任何内容。 def
仅定义函数-在执行f()
之前不会执行。
类似地,您的示例仅定义内部函数,但是只有在调用f3
时,print
语句才会执行。
答案 2 :(得分:2)
这是因为解开代码后,它简化为:
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')
然后执行。