Python如何打印超出范围的变量

时间:2016-09-11 17:06:29

标签: python block

我在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有块范围所以这怎么可能?

4 个答案:

答案 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程序文本,作为一个单元执行。以下是块:模块,函数体和类定义   ...
  范围定义块内名称的可见性。如果在块中定义了局部变量,则其范围包括该块。

因此,在这种情况下,块与代码的可视块完全不同。因此,ifforwhile语句没有自己的范围。但值得注意的是,理解和生成器表达式是使用函数作用域实现的,因此它们有自己的作用域。

答案 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块不计算。”

也很有用:Short Description of the Scoping Rules?