我在 Python 中有以下函数,似乎可以正常工作:
def test(self):
x = -1
# why don't I need to initialize y = 0 here?
if (x < 0):
y = 23
return y
Run Code Online (Sandbox Code Playgroud)
但要使其工作,为什么我不需要初始化变量 y?我以为 Python 具有块作用域,那么这怎么可能呢?
这似乎是对Python 范围的一个简单误解。条件语句不创建范围。该名称y位于函数内的局部范围内,因为语法树中存在此语句:
y = 23
Run Code Online (Sandbox Code Playgroud)
这是在函数定义时、解析函数时确定的。事实上,名称y在运行时未绑定时可能会被使用,这一事实是无关紧要的。
这是一个更简单的示例,突出显示了同一问题:
>>> def foo():
... return y
... y = 23
...
>>> def bar():
... return y
...
>>> foo.func_code.co_varnames
('y',)
>>> bar.func_code.co_varnames
()
>>> foo()
# UnboundLocalError: local variable 'y' referenced before assignment
>>> bar()
# NameError: global name 'y' is not defined
Run Code Online (Sandbox Code Playgroud)