Почему переменную можно определить после определения функции, использующей ее? - PullRequest
2 голосов
/ 06 декабря 2011

У меня очень простой и, возможно, глупый вопрос:

Почему это работает?

def print_list():
    for student in student_list:
        print(student)

student_list = ["Simon", "Mal", "River", "Zoe", "Jane", "Kaylee", "Hoban"]
print_list()

Как я узнал функции и аргументы, функция print_list()не должен распознавать student_list, поскольку я не назначил его в качестве аргумента функции.

Ответы [ 3 ]

6 голосов
/ 06 декабря 2011

К тому времени, когда вы звоните print_list(), у вас есть student_list, определенная как глобальная переменная.

1 голос
/ 06 декабря 2011

В Python переменные создаются, когда вы назначаете их. В вашем случае student_list назначается в глобальной области видимости, поэтому это глобальная переменная. (Глобальная область действия - это то, что не входит в вашу функцию.)

Когда Python встречает переменную внутри функции, которая не является локальной переменной (то есть она не была передана в качестве аргумента и не была назначена внутри функции), он автоматически ищет переменную в глобальной области видимости.

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

def b():
    global a
    a = 5

a = 4
print(a)  # prints 4
b()
print(a)  # prints 5

В большинстве случаев вам не нужен оператор global, и я бы порекомендовал вам его не использовать, особенно до тех пор, пока вы не станете более опытными в Python. (Тем не менее, даже опытные программисты на Python не очень часто используют global.)

1 голос
/ 06 декабря 2011

Насколько я понимаю, ваша программа состоит из 3 частей

  1. определение print_list ()
  2. инициализировать student_list (глобальная переменная)
  3. вызовите print_list ()

Когда вы вызываете print_list (), student_list уже там. Кроме того, в функции у вас есть области, где ищется переменная (student_list): 1. локальная область (она потерпит неудачу, потому что вы не определили ее, только ссылались) 2. глобальная область (это будет успешно, потому что это было только инициализировано

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...