我在Python中有以下功能似乎正在起作用:
def test(self):
x = -1
# why don't I need to initialize y = 0 here?
if (x < 0):
y = 23
return y
但为了这个工作,为什么我不需要初始化变量y?我以为Python有块范围所以这怎么可能?
答案 0 :(得分:4)
这似乎是对scope in Python的一个简单误解。条件语句不会创建范围。名称y
位于函数内的本地范围内,因为语句树中存在此语句:
y = 23
这是在解析函数时在函数定义时确定的。在运行时未绑定时可能使用名称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
答案 1 :(得分:2)
您似乎误解了Python's documentation的这一部分:
Python程序是从代码块构造的。块是一段Python程序文本,作为一个单元执行。以下是块:模块,函数体和类定义 ...
范围定义块内名称的可见性。如果在块中定义了局部变量,则其范围包括该块。
因此,在这种情况下,块与代码的可视块完全不同。因此,if
,for
,while
语句没有自己的范围。但值得注意的是,理解和生成器表达式是使用函数作用域实现的,因此它们有自己的作用域。
答案 2 :(得分:1)
python中实际上没有块范围。 变量可以是局部的(函数内部)或全局的(对于整个程序范围也是如此)。
一旦你在'if'块中定义了变量y,就会为这个特定函数保留它的值,直到你使用'del'命令专门删除它,或者函数退出。 从函数中定义的y开始,它就是该函数的局部变量。
答案 3 :(得分:0)
与What's the scope of a Python variable declared in an if statement?中一样:“Python变量的范围限定在最里面的函数或模块中;控制块如if和while块不计算。”