Имеет ли внутренняя переменная более высокий приоритет, чем глобальная переменная? - PullRequest
0 голосов
/ 20 июня 2020

Я обнаружил странный код, касающийся внутренних переменных, поведение которых я не понимаю:

artist = "ABBA"

def printer(artist):
    global internal_var 
    internal_var= "Queen"
    print(artist,"is an artist")

internal_var = "U2" # I added this line

printer(artist) 
printer(internal_var) # I thought this would be "U2" ...

print(internal_var) # I added this line; I thought this would be "U2" ...

Результат:

ABBA is an artist
Queen is an artist
Queen

Я полностью запутался. Во-первых, почему это не приводит к конфликту? Во-вторых, почему internal_var не перезаписывается? В-третьих, как я могу перезаписать internal_var?

Я думаю, что это можно использовать до определенной степени, но это приведет к большему количеству ошибок.

Пожалуйста, скажите мне, дублируется ли этот вопрос. (Я не смог найти подобного вопроса.) Заранее спасибо.

Ответы [ 2 ]

3 голосов
/ 20 июня 2020

Во-первых, почему это не приводит к конфликту? Во-вторых, почему не перезаписывается internal_var? В-третьих, как я могу перезаписать internal_var?

Действительно существует «конфликт» в том, что internal_var внутри def printer имеет то же имя, что и internal_var в глобальной области. Поскольку вы использовали ключевое слово global, конфликт разрешается за счет того, что обе области ссылаются на значение, определенное в глобальной области. Обычно локальная переменная «затеняет» любые переменные глобальной области с тем же именем (т. Е. Создается отдельное значение для локальной области действия, и переменная глобальной области становится недоступной).

Если путем «перезаписи» вы имеете в виду, что его значение переназначено - это так. Вот почему вы видите «Queen» в строке списка вашего вывода.

Если вы имеете в виду «переопределено», например, «затененное» с другим значением, как описано выше, это потому, что вы использовали ключевое слово global и поэтому явно запретил локальной переменной затенять глобальную переменную.

Я думаю, что это можно использовать в определенной степени, но это приведет к большему количеству ошибок. Да. Использование ключевого слова global - это то, что я бы назвал «запахом кода» - это то, чего вы не должны (почти?) Никогда не делать, потому что это значительно увеличивает вероятность загадочных ошибок. Если вы только начинаете, я бы порекомендовал избегать его любой ценой и с подозрением относиться к любому учебнику, который вы видите, в котором он используется, если только он не находится в контексте урока, который просто учит вас, как это работает (если вы придется отлаживать чужой код), прежде чем посоветовать вам никогда не использовать его. :)

1 голос
/ 20 июня 2020

В код добавлено несколько комментариев, поясняющих, как это работает:

artist = "ABBA"

def printer(artist):
    global internal_var 
    internal_var= "Queen"
    print(artist,"is an artist")

internal_var = "U2" # I added this line; this line define global variable internal_var and set "U2"  
# note till this point we have two global variables as: (1) artist="ABBA" and  (2) internal_var= "U2"
print(internal_var) # display "U2" 

printer(artist) # internal_var is changed by printer to "Queen" because using global inside printer as "global internal_var" means you are referring to global variable internal_var.  
print(internal_var) # display "Queen"

printer(internal_var) # I thought this would be "U2" ... Note: you pass "Queen" not "U2", this prints "Queen" and change "Queen" to "Queen" again

print(internal_var) # I added this line; I thought this would be "U2" ... Note: internal_var is "Queen" not "U2" 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...