python3 -c "help(locals)"
说这个locals
功能:
locals()
Return a dictionary containing the current scope's local variables.
这意味着调用只会显示哪些变量是本地locals()
的。这并不意味着不能看到其范围之外的变量——而是只返回本地变量的信息。b()
b()
b()
locals()
b()
您可能想要的是b()
显示有关调用函数的变量的信息。为此,请使用以下代码(显示的b()
局部变量):
def a():
x = 1
def b():
print(locals())
b()
并用这个替换它(它使用inspect
模块来获取调用框架的本地信息):
def a():
x = 1
def b():
import inspect
print(inspect.currentframe().f_back.f_locals)
b()
至于你的其他问题:
def a():
x = 1
def b():
a = x+2
x = 3
b()
您得到的错误是因为 Python 3 允许您在外部范围内设置/分配全局变量和局部变量,前提是您使用global
andnonlocal
关键字声明它们。(我不会在这里解释它们;我只会说你自己查找它们不会有任何问题。)
如果您删除该x = 3
行(保留该a = x+2
行),您的代码将运行,因为x
' 的值正在被使用,但未设置。相反,如果您删除该a = x+2
行(保留该x = 3
行),您的代码将运行,因为它将创建一个新的x
insideb()
范围。
如果您保留这两行,Python 不知道是否x
应该引用x
当前范围之外的内容(a = x+2
似乎暗示)或者它是否应该引用x
本地 tob()
的范围(正如x = 3
暗示的那样)。
如果你想x
成为本地的b()
,那么你不应该在a = x+2
那里有那条线,至少在之前x
没有设置x = 3
。但是如果你想x
成为a()
's x
,那么你应该声明x
为nonlocal
,b()
像这样:
def a():
x = 1
def b():
nonlocal x # use a()'s x
a = x+2
x = 3
b()
如果您感到困惑,请记住 Python 将允许您使用全局变量和在当前范围之外创建的变量,但前提是您不分配给它们。(读取全局变量通常是可以接受的,但设置它们是不受欢迎的。)
如果要设置全局变量或非局部变量,则必须使用global
(for global variables) 或nonlocal
(for non-local variables) 声明这些变量,如上面的代码所示。
我希望这有帮助。