2017-01-29 8 views
0

Я изучаю Python и читаю блоги об этой ошибке, но я до сих пор не могу понять это ясно. Это фрагмент кода, который я пишу:Концепция 'global name not defined' в python

for i in included: 
    global signs,accounts, regions 
    global sign_name, acc_name, rg_name 
    if type == "regions": 
     regions = i 
     rg_name = regions['data']['region'] 
    if type == "accounts": 
     accounts = i 
     acc_name = accounts['data']['account'] 

    print("Stopping account " + acc_name + " in region " + rg_name) 

NameError: глобальное имя «ACC_NAME» не определена.

Я использую Python 2.7 Если кто-нибудь может помочь мне понять концепцию глобальных имен и инициации в Python, было бы здорово. Спасибо заранее.

+0

сделал любой из этих ответов на ваш вопрос? –

+0

Да, это так. Спасибо! – user1725651

ответ

3

Не беспокойтесь :) добро пожаловать на Python! Это бросает эту ошибку, потому что она ищет глобальную переменную, которой не существует, и причина, по которой она не существует, заключается в том, что вы не попадаете в состояние if type == "accounts"!

попробовать это:

for i in included: 
    global signs,accounts, regions 
    global sign_name, acc_name, rg_name 
    regions = "no region yet" 
    acc_name = "no acc_name yet" 
    if type == "regions" 
    regions = i 
    rg_name = regions['data']['region'] 
    if type == "accounts" 
    accounts = i 
    acc_name = accounts['data']['account'] 

    print("Stopping account " + acc_name + " in region " + rg_name) 

Это очистит ошибку и, по крайней мере позволит вам увидеть, что другие ошибки могут появляться :)

Я также отметить, как я уверен, вы услышите от других, нет причин для вас объявлять глобальные переменные в этом контексте. Первоначально было сказано, что «не удается найти глобальную переменную», потому что прежде чем вы вставляете в ключевые слова global, она не запускалась в операторе if, и поэтому сначала он проверил переменные locals() и не нашел их, искал переменные globals(), и не находил его ногами и ошибкой.

Вы можете удалить global переменные, и он будет работать нормально, как так:

for i in included: 
    regions = "no region yet" 
    acc_name = "no acc_name yet" 
    if type == "regions" 
    regions = i 
    rg_name = regions['data']['region'] 
    if type == "accounts" 
    accounts = i 
    acc_name = accounts['data']['account'] 

    print("Stopping account " + acc_name + " in region " + rg_name) 

Другое быстрое примечание, никогда type в качестве переменной ... использовать type_ вместо этого. Причина в том, что type - это функция Python , и если вы используете type в качестве переменной, вы случайно накладываете имя встроенного имени.

Наконец, просто чтобы очистить сценарий немного больше:

# only use "i" when you're using numbers, otherwise just call it 
# the name of the data you're using :) 
for account_data in included: 
    regions = "no region yet" 
    acc_name = "no acc_name yet" 
    if type_ == "regions" 
    rg_name = account_data['data']['region'] 
    if type_ == "accounts" 
    acc_name = account_data['data']['account'] 

    # here's an example of Pythonic string formatting :) 
    print("Stopping account {} in region {}".format(acc_name, rg_name)) 
+0

Большое спасибо! Это было отличное объяснение, теперь он проясняет ситуацию – user1725651

2

Перед использовать глобальную переменную acc_name в функции для чтения, он должен быть первым инициализированному где: либо за пределами функции или внутри него. Если type == "accounts", тогда переменная будет инициализирована, но если это не так, это не так.

+0

Спасибо большое! Я определил их вне функции и работает – user1725651

2

Из того, что я вижу, является то, что вы никогда не предопределяете acc_name как в локальных, так и в глобальных масштабах. Ошибка не существует, если вы добавите acc_name = 'something' в любом месте до print("Stopping account " + acc_name + " in region " + rg_name).

Ошибка вашего кода в том, что if type == "accounts", но тип не был «аккаунтом», поэтому acc_name = accounts['data']['account'] никогда не запускался.

Попробуйте это:

for i in included: 
    global signs,accounts, regions 
    global sign_name, acc_name, rg_name 

    if type == "regions": 
     regions = i 
     rg_name = regions['data']['region'] 
    else: 
     rg_name="No regions" #backup str 
    if type == "accounts": 
     accounts = i 
     acc_name = accounts['data']['account'] 
    else: 
     acc_name="No accounts" #backup str 

    print("Stopping account " + acc_name + " in region " + rg_name) 

Таким образом, не будет никаких ошибок

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^