我对Python很陌生,请尝试了解它的工作原理。现在我遇到了一个使我困惑的范围界定问题。
我认为我理解以下示例。我用一个空的本地名称空间构造一个函数(如果我的术语不正确,请更正我)。调用时,它必须打印变量x的值。那不在函数的名称空间中,因此Python在封闭的名称空间中查找,在那里找到x并输出值。
x = 12
def f():
print(locals())
print(x)
f()
返回:
[]
12
我从各种来源获悉,函数的名称空间是在函数评估期间构造的,并且在函数评估结束时消失。这就是我在下一个示例中看到的。当函数评估开始时,只有函数参数位于名称空间中。然后完成对y和z的赋值,导致y和z依次放置在本地名称空间中,如输出中的三个打印结果所示。
def f(x):
print(locals())
y = 20
print(locals())
z = x+y
print(locals())
return z
f(10)
返回:
{'x': 10}
{'x': 10, 'y': 20}
{'x': 10, 'y': 20, 'z': 30}
30
现在我无法理解的微妙之处。在第一个示例中,我在print语句之后添加了对x的赋值。
x = 12
def f():
print(locals())
print(x)
x = 24
f()
结果:
{}
Traceback (most recent call last):
File "<pyshell#6>", line 1, in <module>
f()
File "<pyshell#5>", line 5, in f
print(x)
UnboundLocalError: local variable 'x' referenced before assignment
当必须打印x时,它还不在本地名称空间中。因此,我希望看到外部值12。但是Python似乎意识到x是函数的局部变量并产生UnboundLocalError的事实。
这向我建议,在读取函数的定义时,Python会使用局部变量的字符串名称创建一些列表或其他列表,我认为其中包括参数的默认值。然后在构造本地命名空间的功能评估期间使用此列表。此列表存储在哪里?很可能,我完全错了。我们非常感谢您对这里发生的事情有帮助。