UnboundLocalError: local variable ‘rule‘ referenced before assignment

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