0
z = 0

def fun():
    print(z)
    global z
    z = 2
    print(z)

fun()
print(z)

以上代码为啥会报 global 的错
顺便讲下这串代码的执行顺序

2个回答

1

因为你在global z之前加了print(z),这样相当于引用z,这是非法的。

z = 0

def fun():
    global z
    print(z, id(z))
    z = 2
    print(z, id(z))

fun()
print(z, id(z))

之所以这么要求,是因为还会出现下面这种歧义性的错误,不可以在引用之后再去赋值绑定一个变量,Python会认为应当是局部变量:

z = 0
def fun():
    #global z
    print(z)
    z = 2
    print(z)

fun()
print(z)

但是可以直接print,即隐式地global:

z = 0

def fun():
    print(id(z))

fun()
print(id(z))
0

这个文章写的还可以,就不重复了。http://python.jobbole.com/86465/

撰写答案