python中的作用域如何工作(从内部函数访问外部变量)

时间:2018-01-16 13:27:54

标签: python variables scope

有人可以解释范围如何在python中工作我以为我理解它但有一件事我不明白。在这个例子中,我使用全局关键字来访问全局变量,但如果在函数 function 中定义变量 x ,那么尝试在另一个变量中访问该变量函数, sub_function ,在main函数中定义(例2)。

示例1

x = 10
def function():
    def sub_function():
        global x
        x += 1
    sub_function()
function() 

示例2

def function():
    x = 10
    def sub_function():
        x += 1
    sub_function()
function() 

这给出了错误“UnboundLocalError:在赋值之前引用的局部变量'x'”

我假设由于x在function()中,它是在某个堆栈上创建的,只有在funcition()超出范围后才会被删除。 sub_function()在function()的范围内,所以x应该仍然可用。

更新 我知道python需要global关键字来引用一个全局变量来修改它。但是如果变量不是全局变量而不是我的范围。基本上,示例2中的 x 不是全局的......是吗?

1 个答案:

答案 0 :(得分:0)

事情是Python默认允许您读取父作用域中定义的变量,只要您不尝试覆盖它们

def function():
    x = 10
    def sub_function():
        x = x + 1 # here Python is not really sure if you want
                  # to define the x variable in local scope or
                  # you're trying to modify the global variable.
                  # Since you're mutating the variable, Python assumes
                  # that x must be local variable which you forgot to
                  # define.

        y = x + 1 # would raise no error.

在Python 3x中,您可以使用nonlocal构造,但在Python 2x中,唯一的选择是使用可变变量x = [10]或将x复制到本地范围的另一个变量中。

def function():
    x = 10
    def sub_function():
        y = x # create an alias of x for mutable variables
        y = y + 1 # would raise no error