UnboundLocalError: local variable ‘rule‘ referenced before assignment

前言
看了很多人说的,都没有说到点上,根本没有解释原因或者解决我的困惑。遂有此篇。

困惑
我们先看两个例子,我问你,下面哪个会报错。

x=[2,3]#全局变量
def a():
    print(x)
    x[0]=1
a()
 
x=[2,3]#全局变量
def a():
    print(x)
    x=1
a()


 
哈哈,很神奇,第一个不报错,第二个报错。

原因
如果你在一个函数内部,对一个全局变量x进行了赋值,例如下面这种:

x=5
x=[1,2]
x=x+1
 
那么python会将这个变量认为是函数的局部变量,而不再是全局变量,所以此时,前面如果有代码:

print(x)
 
就会报错。

应该指出的是,仅限于赋值类型的操作,就是那种开辟新内存,然后这个变量指向了这个地方的这种操作。上面我写的

x=5
x=[1,2]
x=x+1
 
就是属于这种类型的操作,而对于inplace这种修改操作仍然在原内存中进行,所以这个仍然是全局变量,例如例子1中的。

x[0]=1
 
这种操作虽然也是赋值,但是不是一般的赋值,是inplace操作,在原内存修改。

解决办法
我们说了原因,精髓都说完了,但是,例如上面的例子2:

x=[2,3]#全局变量
def a():
    print(x)
    x=1
a()


假如我们就是要先打印全局变量x,然后再赋值呢?那该怎么办,如何完成我们的意图?

解答:既然python认为我们的x是局部变量,那么声明其为
全局变量即可。

x=[2,3]#全局变量
def a():
    global x#声明一下哈。
    print(x)
    x=1
a()


 

 https://blog.csdn.net/qq_43391414/article/details/124249996

猜你喜欢

转载自blog.csdn.net/qq_42672770/article/details/131660597