2015-04-21 4 views
0

Все, что я хочу, это назначить некоторое начальное значение переменной «extra_devices», и если пользователь задает некоторое значение этой переменной во время выполнения, значение по умолчанию заменяется на указанное пользователем значение. Я добавляю минимальный фрагмент кода, чтобы показать, что я делаю.Доступ к глобальной переменной

При запуске этой программы, если я не укажу «extra_devices», программа не запускается, говоря «UnboundLocalError: локальная переменная« extra_devices », на которую ссылаются перед назначением», но я не понимаю причину, поскольку я уже назначил значение для него. Тем не менее, программа работает нормально, если я укажу «extra_devices» во время выполнения. Кто-нибудь получил какие-либо аргументы в пользу такого поведения?

Извещение переменной abc печатает штрафом в main().

#/usr/bin/python 
    import argparse 
    extra_devices=10 
    abc = 1 
    def main(): 

     parser = argparse.ArgumentParser(description='') 
     parser.add_argument('-extra_devices','--extra_devices',help='extra_devices',required=False) 
     args = parser.parse_args() 
     if args.extra_devices is not None: extra_devices = args.extra_devices 
     print "abc="+str(abc) 

     print "extra_devices = "+str(extra_devices) 

    if __name__ == '__main__': 
     main() 

ответ

2

Добавьте одну строку в функции:

global extra_devices 

Тогда вы можете написать к глобальной переменной в функции.

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

Update:

Добавить причину.

+3

Я бы предложил «написать», а не «доступ», но да. –

+0

Нет. Но я могу получить доступ к другим переменным. Проблема возникает из-за того, что args.extra_devices не является None: extra_devices = args.extra_devices. Если я удалю эту строку, она отлично работает. – Pretty

+0

@ Довольно, вы действительно попробовали предложение, данное здесь, прежде чем комментировать? –

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