有人可以解释范围如何在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 不是全局的......是吗?
答案 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