Python 为什么分配局部变量会改变函数中前几行代码的行为?

Python 为什么分配局部变量会改变函数中前几行代码的行为?,python,Python,我们一直在做测试,试图理解文档中写的内容 我注意到,如果一个函数使用一个没有在本地定义的变量,它将使用父范围中设置的变量。但是,如果该函数稍后在函数中设置该变量,它将决定不能使用父作用域中设置的变量并终止 下面的第一个函数起作用,第二个函数不起作用 def printthingy(): print(foo) #foo = 'goodbye world' def printthinghy2(): print(foo) foo = 'goodbye world'

我们一直在做测试,试图理解文档中写的内容

我注意到,如果一个函数使用一个没有在本地定义的变量,它将使用父范围中设置的变量。但是,如果该函数稍后在函数中设置该变量,它将决定不能使用父作用域中设置的变量并终止

下面的第一个函数起作用,第二个函数不起作用

def printthingy():
    print(foo)
    #foo = 'goodbye world'

def printthinghy2():
    print(foo)
    foo = 'goodbye world'

foo = 'hi world'
printthingy()
printthinghy2()

我希望函数在能够找到用于打印的foo方面表现一致。相反,第一个函数起作用,第二个函数给出一个“赋值前引用的局部变量‘foo’”错误。

了解局部变量和全局变量。在Python中,默认情况下,函数中分配的每个变量都被视为局部变量,否则被视为全局变量。因此,第一次工作是因为
foo
被认为是全局的,第二次崩溃是因为它被认为是本地的,但在第一次访问它时还没有被分配。

为什么它被认为是本地的,因为它分配得晚了?直觉是,它只有在被分配时才成为局部的。否则,它会导致一些情况,例如在函数后面添加一行赋值变量会莫名其妙地打断前面的行。这里的python@SirTophattingson并没有遵循直觉。这是完全可以解释的:我给了你解释。在第二个示例中,编译器(是的,Python有一个编译器)将变量定义为本地变量,当您运行程序时,它会尝试打印这个仍然未定义的本地变量。