Функция не изменяет глобальную переменную
Мой код выглядит следующим образом:
done = False
def function():
for loop:
code
if not comply:
done = True #let's say that the code enters this if-statement
while done == False:
function()
По какой-то причине, когда мой код входит в оператор if, он не выходит из цикла while после того, как это сделано с помощью функции ().
НО, если я кодирую это так:
done = False
while done == False:
for loop:
code
if not comply:
done = True #let's say that the code enters this if-statement
... он выходит из цикла while. Что тут происходит?
Я убедился, что мой код входит в оператор if. Я еще не запускал отладчик, потому что в моем коде много циклов (довольно большой 2D-массив), и я отказался от отладки из-за его утомительности. Почему "готово" не изменяется, когда оно в функции?
3 ответа
Ваша проблема в том, что функции создают свое собственное пространство имен, что означает, что done
внутри функции отличается от done
во втором примере. использование global done
использовать первый done
вместо создания нового.
def function():
global done
for loop:
code
if not comply:
done = True
Объяснение того, как использовать global
можно найти здесь
done=False
def function():
global done
for loop:
code
if not comply:
done = True
вам нужно использовать ключевое слово global, чтобы интерпретатор знал, что вы ссылаетесь на глобальную переменную done
иначе он создаст другого, которого можно прочитать только в функции.
Использование global
только тогда вы можете изменить глобальную переменную, иначе оператор done = True
внутри функции объявят новую локальную переменную с именем done
:
done = False
def function():
global done
for loop:
code
if not comply:
done = True
Узнайте больше о глобальном заявлении.
Используя class
скорее, чем global
:
Другой способ обрабатывать (не использовать) глобальные переменные - обернуть функции и переменные, которые вы хотите сделать глобальными, в класс.
Хотя для данного конкретного случая это немного тяжеловато - классы добавляют проекту массу функциональности и гибкости. (Лично) очень рекомендуется.
Например:
class Processor():
"""Class container for processing stuff."""
_done = False
def function(self):
"""A function which processes stuff."""
# Some code here ...
self._done = True
# See the flag changing.
proc = Processor()
print('Processing complete:', proc._done)
proc.function()
print('Processing complete:', proc._done)
Выход:
Processing complete: False
Processing complete: True