Подтвердить что ты не робот

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

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

done = False

def function():
    for loop:
        code
        if not comply:
            done = True  #let 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 say that the code enters this if-statement

... он выходит из цикла while. Что здесь происходит?

Я убедился, что мой код входит в оператор if. Я еще не запускал отладчик, потому что у моего кода много циклов (довольно большой 2D-массив), и я отказался от отладки из-за того, что он был настолько утомительным. Почему "сделано" не изменяется, когда оно находится в функции?

4b9b3361

Ответ 1

Ваша проблема в том, что функции создают собственное пространство имен, а это означает, что done внутри функции отличается от done во втором примере. Используйте global done, чтобы использовать первый done вместо создания нового.

def function():
    global done
    for loop:
        code
        if not comply:
            done = True

Объяснение того, как использовать global, можно найти здесь

Ответ 2

done=False
def function():
    global done
    for loop:
        code
        if not comply:
            done = True

вам нужно использовать ключевое слово global, чтобы интерпретатор знал, что вы ссылаетесь на глобальную переменную done, иначе она собирается создать другую, которая может быть прочитана только в функции.

Ответ 3

Используйте global, только тогда вы можете изменить глобальную переменную, иначе оператор вроде done = True внутри функции объявит новую локальную переменную с именем done:

done = False
def function():
    global done
    for loop:
        code
        if not comply:
            done = True

Подробнее о глобальном заявлении.