Python 3中全局变量的正确使用方法是什么?:
1) 在核心脚本中声明global VAR_NAME
一次(不在函数中),然后在的其他地方简单地将变量称为VAR_NAME
2) 在使用全局变量的每个函数中声明global VAR_NAME
一次,然后在函数的其余部分和核心脚本本身中简单地将变量称为VAR_NAME
在第一种情况下,全局关键字毫无意义,因此这是不正确的。在模块级别定义变量会使其成为全局变量,不需要全局关键字。
第二个例子是正确的用法。
然而,全局变量最常见的用法是在任何地方都不使用全局关键字。只有当您想重新分配函数/方法中的全局变量时,才需要全局关键字。
如果使用全局变量的方式会被解释为对局部变量的赋值,则需要在函数中使用全局关键字。如果没有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等方法时,内存位置本身会发生变化,因此可变引用的值也会全局变化。
现在最大的问题是,函数如何知道我们正在修改的变量是全局变量还是局部变量,因为如果全局变量是可变的,我们似乎可以修改它,如果它是不可变的,则我们不能修改它(函数也不将其识别为全局变量)