擅长:python、mysql、java
<p>python中有一个名为<code>UnboundLocalError</code>的错误,它常常使新用户感到困惑。令人困惑的是:<em>future</em>赋值<strong>会改变查找变量的方式。</p>
<p>当解释器第一次看到变量名时,它会向前看到当前代码块的末尾,如果在同一代码块中的任何地方都没有对它的赋值,解释器会认为它是全局的。但是,如果您这样做了,那么它被认为是本地的,并且在赋值之前对它的任何引用都会生成一个<code>UnboundLocalError</code>。这就是你犯的错误。这就是为什么您需要声明<code>global rep_i</code>。如果你不指定<code>rep_i</code>,你就不需要这一行。</p>
<p>而且,这与变量类型无关。此外,将一个项分配或附加到列表(您可能打算这样做,但没有这样做)并不是列表本身的分配,它实质上是对列表对象调用一个方法,这与分配不同:分配创建一个新对象(可能在已经存在的名称下),而操作列表只会更改一个现有的列表。
您可以尝试:</p>
<pre><code>In [1]: # It won't work with small integers, as they are cached singletons in CPython
In [2]: a = 123123
In [3]: id (a)
Out[3]: 9116848
In [4]: a = 123123
In [5]: id(a)
Out[5]: 9116740
In [6]: # See, it changed
In [7]: # Now with lists
In [8]: l = [1,2,3]
In [9]: id(l)
Out[9]: 19885792
In [10]: l[1] = 2
In [11]: id(l)
Out[11]: 19885792
In [12]: # See, it is the same
In [13]: # But if i reassign the list, even to the same value
In [14]: l = [2,2,3]
In [15]: id(l)
Out[15]: 19884272
</code></pre>