在Python 3中正确使用全局变量是什么?:
1)在核心脚本(不在函数内)中说明global VAR_NAME
一次,然后在其他地方简单地将变量称为VAR_NAME
2)在每个使用全局变量的函数中说明global VAR_NAME
一次,然后简单地将变量称为VAR_NAME
,用于函数的其余部分和核心脚本本身
答案 0 :(得分:50)
在第一种情况下,global关键字毫无意义,因此不正确。在模块级别定义变量使其成为全局变量,您不需要全局关键字。
第二个例子是正确用法。
但是,全局变量的最常见用法是不在任何地方使用全局关键字。仅当您要在函数/方法中重新分配全局变量时,才需要全局关键字。
答案 1 :(得分:38)
如果以一种原本可以解释为局部变量赋值的方式使用全局变量,则需要在函数中使用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
答案 2 :(得分:6)
"以某种方式被解释为对局部变量的赋值" ---是的,但这是一个微妙的细节:
-------------------错误:本地变量' 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)
答案 3 :(得分:1)
上述答案中前两种情况与后两种情况之间的主要区别是列表是可变的。对于诸如a = 1的情况,指针指向1所在的位置,当您说a = 2时,指针移动。
对于可变对象,将分配一个内存位置,并且当使用诸如append之类的方法时,内存位置本身也会发生更改,因此可变引用的值会全局更改。
现在最大的问题是函数如何知道我们要修改的变量是全局变量还是局部变量,因为似乎我们可以修改全局变量(如果它是可变的)而不能修改(如果它是不可变的)(该函数还可以无法将其识别为全局变量)