我有两个样本:
一:
import math
def my_function():
print(math.pi)
math.pi = 3
print(math.pi)
my_function()
输出:
3.141592653589793
3
二:
a = 0
def my_function():
print(a)
a = 3
print(a)
my_function()
输出:
UnboundLocalError: local variable 'a' referenced before assignment
那么他们之间有什么区别?在这种情况下,我认为math.pi
和a
都是全局的,它应该生成UnboundLocalError
。
答案 0 :(得分:3)
如果在函数内进行变量赋值,则全局变量将被忽略,并且在函数执行期间无法访问,在ServerCall::close(Status,Metadata)
lib的示例中,您不会覆盖名称math
本身, #39;它为何起作用。下面的Snipped会给你带来与math lib相同的错误:
math
您可以在访问变量之前使用语句global,但如果您稍后将执行任何分配,则会覆盖全局变量,因此最好总是避免这样做。
import math
def my_function():
print(math.pi)
math = 1
my_function()
答案 1 :(得分:1)
在第一个函数中,变量为math
,而不是math.pi
。由于您未分配给math
,因此它不会成为本地变量。分配给变量的属性与分配给变量本身不是一回事。
如果您将功能更改为
def my_function():
print(math.pi)
math = 3
print(math.pi)
你会得到与第二个函数相同的错误:
UnboundLocalError:局部变量' math'在分配前引用
答案 2 :(得分:0)
之前已经回答了几次。
如果函数在该函数内部分配了一个语句,则该变量是函数的本地变量。
在您的实例中,a = 3
将a
定义为函数内的局部变量。第一个print(a)
尝试访问它,但尚未分配值。
这就是你看到的原因:
UnboundLocalError: local variable 'a' referenced before assignment.
由a = 0
创建的全局实例在此处不起作用。