Функция не изменяет глобальную переменную

Мой код выглядит следующим образом:

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
Другие вопросы по тегам