Hay un error en python llamado UnboundLocalError
que a menudo confunde a los recién llegados. Lo confuso es: futuro asignación hace cambiar la forma en que se busca una variable.
Cuando el intérprete ve un nombre de variable por primera vez, mira hacia el final del bloque de código actual, y si no tiene una asignación en cualquier lugar dentro del mismo bloque de código, el intérprete lo considera global. Si lo hace, sin embargo, se considera local, y cualquier referencia a él antes de la asignación genera un UnboundLocalError
. Ese es el error que tienes. Es por eso que necesita declarar global rep_i
. Si no asignó rep_i
, no necesitaría esta línea.
Además, esto no tiene nada que ver con el tipo de variable.Además, asignar o agregar un elemento a la lista (lo que probablemente pretendía hacer, pero no lo hizo) no es la asignación de la lista, básicamente se trata de llamar a un método en un objeto de lista, que es diferente de la asignación: la asignación crea un nuevo objeto (posiblemente bajo un nombre que ya existe), mientras que la manipulación de una lista simplemente cambia una lista existente. Usted puede tratar de:
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
Entonces, ¿eso significa que si agrego algo a la lista, fallará? voy a tratar. –
añadiendo algo a rep_lst no falla, estoy confundido .. –
No, no fallará. Es solo si asigna el nombre global, lo que se conoce como volver a vincular. Entonces 'rep_lst = []' creará una nueva lista y le vinculará una nueva variable local. Pero 'rep_lst.append()' buscará el nombre 'rep_lst', lo encontrará en el espacio de nombre global y llamará a un método sobre él. –