python全局变量的奇怪行为

时间:2018-03-27 17:51:28

标签: python

看看这个非常基本的代码:

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变量没有错误?这个变量也应该被声明为全局变量?为什么我没有错误?

由于

2 个答案:

答案 0 :(得分:2)

来自Python Docs

  

在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来确保您真正了解您正在玩的内容。关键字。