看看这个非常基本的代码:
s2 = 'prefixe'
cpt = 1
def test():
cpt += 1
str = "%s%d" % (s2,cpt)
print(str)
test()
我有错误。它说在分配之前读取了cpt。 我认为这是正常的,因为cpt应该被声明为全局变量:
s2 = 'prefixe'
cpt = 1
def test():
global cpt
cpt += 1
str = "%s%d" % (s2,cpt)
print(str)
test()
在这种情况下,我没有错误,程序运行正常。
但是,为什么s2变量没有错误?这个变量也应该被声明为全局变量?为什么我没有错误?
由于
答案 0 :(得分:2)
在Python中,仅在函数内引用的变量是 隐含全球性。如果变量在其中的任何位置分配了值 函数的主体,除非明确指出,否则它被认为是本地的 宣布为全球。
由于s2
仅在函数内部被读取(未分配),因此它是隐式全局的,并且没有错误。但是,如果您尝试修改s2
,除非您将其定义为global
,否则会抛出错误,因为默认情况下它会假设变量是本地的,并且没有名为{的本地变量{1}}。
就个人而言,我同意这有点不直观。
答案 1 :(得分:1)
你可以参考:
Using global variables in a function other than the one that created them
您可以在其他函数中使用全局变量,在每个分配给它的函数中将其声明为global
:
s2 = 'prefixe'
cpt = 1
def test():
global cpt # Needed to modify global copy of cpt
cpt += 1
str = "%s%d" % (s2,cpt) # No need for global declaration to read value
print(str)
test()
我想因为它的原因是,由于全局变量非常危险,因此Python希望通过明确要求global
来确保您真正了解您正在玩的内容。关键字。