В python есть ошибка с именем UnboundLocalError
, которая часто сбивает с толку новичков. Заблуждение таково: будущее назначение меняет способ поиска переменной.
Когда интерпретатор видит имя переменной в первый раз, он смотрит вперед до конца текущего блока кода, и если у вас нет присвоения ему где-либо в пределах того же блока кода, интерпретатор считает его глобальным , Однако, если вы это сделаете, то он считается локальным, и любая ссылка на него до присвоения генерирует UnboundLocalError
. Это ошибка, которую вы получили. Вот почему вам нужно объявить global rep_i
. Если вы не указали rep_i
, вам не понадобится эта строка.
Кроме того, это не имеет ничего общего с типом переменной. Кроме того, назначение или добавление элемента в список (что вы, вероятно, хотели сделать, но не сделали) не является назначением самого списка, это, по сути, вызов метода для объекта списка, который отличается от назначения: назначение создает новый объект (возможно, под именем, которое уже существует), а манипулирование списком просто изменяет существующий список.
Вы можете попробовать:
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