在Python 3中正确使用全局变量是什么?:
1)在核心脚本(不在函数内)中说明global VAR_NAME
一次,然后在其他地方简单地将变量称为VAR_NAME
2)在每个使用全局变量的函数中说明global VAR_NAME
一次,然后简单地将变量称为VAR_NAME
,用于函数的其余部分和核心脚本本身
在第一种情况下,global关键字是没有意义的,因此这是不正确的。在模块级别定义变量使其成为全局变量,您不需要全局关键字。
第二个例子是正确的用法。
但是,全局变量的最常见用法是不在任何地方使用global关键字。仅当您要在函数/方法中重新分配全局变量时才需要global关键字。
如果以一种本来可以解释为局部变量赋值的方式使用全局变量,则需要在函数中使用global关键字。如果没有global关键字,您将创建一个隐藏函数范围内的全局变量的局部变量。
这里有一些例子:
global_var = 1
def example1():
# global keyword is not needed, local_var will be set to 1.
local_var = global_var
def example2():
# global keyword is needed, if you want to set global_var,
# otherwise you will create a local variable.
global_var = 2
def example3():
# Without using the global keyword, this is an error.
# It's an attempt to reference a local variable that has not been declared.
global_var += 1
“以某种方式将其解释为对局部变量的赋值”---是的,但这里有一个微妙的细节:
-------------------错误:赋值前引用的局部变量'c'
def work():
c += 3
c = 0
work()
print(c)
-------------------错误:赋值前引用的局部变量'c'
c = 0
def work():
c += 3
work()
print(c)
-------------------打印[3]
def work():
c.append(3)
c = []
work()
print(c)
-------------------打印[3]
c = []
def work():
c.append(3)
work()
print(c)
前两个案例与上述答案中接下来两个案例的主要区别在于列表是可变的。对于像a = 1的情况,指针指向1所在的位置,当你说a = 2时指针移位。
对于可变对象的情况,分配存储器位置,并且当使用诸如append的方法时,存储器位置本身发生改变,因此可变引用的值全局改变。
现在最大的问题是函数如何知道我们正在修改的变量是全局变量还是本地变量,因为看起来我们可以修改全局变量(如果它是可变的)我们不能修改它的非变量(函数也不能识别它)作为全局变量)