当我尝试在 Python3 中的函数中打印全局变量时出错

Getting error when I try to print a global variable in a function in Python3

在这个简单的代码中了解全局变量和局部变量的区别:

def sub():
    print(a)
    a="banana"
    print(a)

a="apple" 
sub()
print(a)

我收到一个错误:

UnboundLocalError

Traceback (most recent call last) in
5
6 a="apple"
----> 7 sub()
8 print(a)

in sub()
1 def sub():
----> 2 print(a)
3 a="banana"
4 print(a)
5

UnboundLocalError: local variable 'a' referenced before assignment

我目前了解到 'a' 是一个全局变量,它在 函数之外声明。

(它没有在像 C 中的 main() 这样的任何函数上声明)

但是为什么这个错误告诉我 'a' 是局部变量?

我知道如果我在 print(a) 行上方添加 global a 将解决此错误,但我想知道为什么。

Python 将函数中的这一行:a="banana" 解释为新的局部变量 a 的定义。函数范围内的这个变量取代了全局变量a。请注意,print(a)(对局部变量 a 的引用)发生在 之前 a="banana"(= 赋值)。因此你得到错误:UnboundLocalError: local variable 'a' referenced before assignment.

另请参见:
Why am I getting an UnboundLocalError when the variable has a value?
Python gotchas
The 10 Most Common Mistakes That Python Developers Make

主要原因是通过放置

print(a)

在函数内部将变量 'a' 设置为该函数的局部变量(即局部作用域)。忽略

a="apple"

在函数外定义。

并且由于 'a' 值尚未在 'sub' 函数中初始化,因此在执行 print(a) 时无法找到它的值,因此显示 在赋值之前引用的局部变量 'a' 正是上述情况中发生的情况。

摘要

def sub():

#     print(a)  #Just comment this and you will understand the difference

## By doing print(a) inside sub function makes sets 'a' as local variable
## whose value has not been initialized
## and as its value couldn't be found while line print(a) executes hence shows
## local variable 'a' referenced before assignment which is exactly what 
##   happens

    a="banana" # a is assigned here 
    print(a)


a="apple" 
sub()
print(a)