Странное поведение, почему нельзя использовать внешнюю переменную в функции? - PullRequest
0 голосов
/ 28 января 2019

Я написал стартер для игры в слова.После предположения пробелы либо обновляются, либо нет (правильное или неправильное предположение).Вот код:

blanks = "*********"
def check(word, guess):

    if guess == word:
        print("Correct guess: "+guess)
        blanks = word
        return blanks
    else:
        input("wrong guess (press any key)")
        return blanks

secretword = "Macedonia"
guess = input("type your guess: ")
result = check(secretword, guess)

Когда реализовано check и удовлетворено условие else, пробелы не могут быть использованы.Но можно использовать пробелы в условии if.

* Когда я комментирую blanks=word, код работает нормально.

Почему это?Мысли глобальные переменные могут ссылаться где угодно.Спасибо

ПОЧЕМУ ГОЛОСОВАТЬ?Вопрос понятный и не дублирующий, и не провокационный.И это полезно.

Ответы [ 2 ]

0 голосов
/ 28 января 2019

На глобальные переменные действительно можно ссылаться где угодно, но когда вы присваиваете переменную внутри функции, если только вы не укажете Python, что эта переменная является локальной переменной всей функции.Так что blanks внутри функции не имеет отношения к blanks вне функции.

Когда код выбирает путь else, он пытается сослаться на локальный blanks, но никакое значение еще не было присвоено, поэтомувы получите исключение UnboundLocalError.

. Чтобы исправить это, вы должны сообщить Python, что присвоение внутри функции является присваиванием глобальному blanks:

def check(word, guess):
    global blanks
    ... rest of code

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

y = 0
def foo():
    return y # This is a local variable (but unbound so will error)
    y = 1    # this is unreachable but still makes `y` local.
0 голосов
/ 28 января 2019

Переменная blanks должна быть определена внутри метода check, чтобы она могла использовать ее.

def check(word, guess):
    blanks = ""
    if guess == word:
        print("Correct guess: "+guess)
        blanks = word
        return blanks
    else:
        input("wrong guess (press any key)")
        return blanks

ИЛИ

, если вы хотите использовать ее globally:

blanks = "*********"

def check(word, guess):
    global blanks
    if guess == word:
        print("Correct guess: "+guess)
        blanks = word
        return blanks
    else:
        input("wrong guess (press any key)")
        return blanks

secretword = "Macedonia"
guess = input("type your guess: ")
result = check(secretword, guess)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...