在Python作用域中,对未在该作用域中声明的变量的任何赋值都会创建一个新的局部变量。除非该变量在函数的前面声明为引用带有关键字的全局范围变量。global.
让我们看一下您的伪代码的修改版本,看看会发生什么:# Here, we're creating a variable 'x', in the __main__ scope.x = 'None!'def func_A():
# The below declaration lets the function know that we
# mean the global 'x' when we refer to that variable, not
# any local one
global x
x = 'A'
return xdef func_B():
# Here, we are somewhat mislead. We're actually involving two different
# variables named 'x'. One is local to func_B, the other is global.
# By calling func_A(), we do two things: we're reassigning the value
# of the GLOBAL x as part of func_A, and then taking that same value
# since it's returned by func_A, and assigning it to a LOCAL variable
# named 'x'.
x = func_A() # look at this as: x_local = func_A()
# Here, we're assigning the value of 'B' to the LOCAL x.
x = 'B' # look at this as: x_local = 'B'
return x # look at this as: return x_local
实际上,您可以重写所有func_B使用名为x_local它的工作原理是一样的。
顺序只与函数执行更改全局x值的操作的顺序有关。因此,在我们的示例中,顺序并不重要,因为func_B打电话func_A..在本例中,顺序确实很重要:def a():
global foo
foo = 'A'def b():
global foo
foo = 'B'b()a()print foo# prints 'A' because a() was the last function to modify 'foo'.
请注意global只需要修改全局对象。您仍然可以在函数中访问它们,而不需要声明global..因此,我们有:x = 5def access_only():
return x # This returns whatever the global value of 'x' isdef modify():
global x
x = 'modified'
return x # This function makes the global 'x' equal to 'modified', and then returns that valuedef create_locally():
x = 'local!'
return x # This function creates a new local variable named 'x', and sets it as 'local',
# and returns that. The global 'x' is untouched.
注意create_locally和access_only -- access_only正在访问全局x,尽管没有调用global,即使create_locally不使用global或者,它创建一个本地副本,因为它的分配a值。
这里的困惑就是为什么不应该使用全局变量。