2016-06-06 2 views
0

Ответ должен быть 2, потому что сначала вызывается функция main(), затем вызывается функция first(), переопределяя глобальную переменную num = 0, которая была определена вне любых функций, поэтому превращая ее в переменную с глобальной областью. Тем не менее, я получаю следующую ошибку:Почему я получаю локальную переменную, указанную до ошибки присваивания?

UnboundLocalError: local variable 'num' referenced before assignment 

Почему я получаю эту ошибку?

def first(): 
    num = num + 1 

def main(): 
    num = 1 
    first() 
    print(num) 

num = 0 

num_result = main() 

print(num_result) 

ответ

5

Внутри first, num не известно. Используйте аргументы и return операторов.

def first(num): 
    return num + 1 

def main(): 
    num = 1 
    num = first(num) 
    return num 

num = 0 

num_result = main() 

print(num_result) 
+1

Должно ли это быть неизвестно?Потому что num = 0 было определено с глобальной областью, поэтому почему она не определена внутри функции first()? –

+0

Нет, 'num' не был определен с глобальной областью. Пожалуйста, не ставьте один и тот же комментарий под каждым ответом. Попытайтесь понять область действия в Python. –

+2

Что вы называете переменной num вне функций, если это не глобально, что это такое? –

7

ОП писал (курсив мой):

The answer should be 2 because first the main() function is called, then the first() function is called, overriding the global variable.

Не отвергая глобальную переменную. Если вы явно не укажете переменную как глобальную, если есть какое-либо назначение переменной в функции, она считается локальной. Смотрите также python tutorial on defining functions, где говорится (курсив мой):

More precisely, all variable assignments in a function store the value in the local symbol table; whereas variable references first look in the local symbol table, then in the local symbol tables of enclosing functions, then in the global symbol table, and finally in the table of built-in names. Thus, global variables cannot be directly assigned a value within a function (unless named in a global statement), although they may be referenced.

и documentation of the global statement (если кто-нибудь с помощью Python 3 смотрит на это, пожалуйста, также взглянуть на (по сравнению с global) очень полезный nonlocal statement и его PEP 3104).

Чтобы «исправить» ваш код:

def first(): 
    global num 
    num = num + 1 

def main(): 
    global num 
    num = 1 
    first() 
    print(num) 

num = 0 

num_result = main() 

print(num_result) 

Не использовать глобальные переменные таким образом, пожалуйста. @LutzHorn has shown in his answer how to do it right.

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

+1

Если вы посмотрите на код, num = 0 определяется вне любых функций. Если у этого не будет глобального масштаба? –

+0

@ Dr.Doom2020 №. В какой области видимость переменной зависит только от тела функции. «В случае сомнений» локальные переменные имеют приоритет, а локальная область - по умолчанию для любого имени, которое вы назначили. Пожалуйста, прочитайте и попытайтесь понять часть учебника, которое я связал. Вернитесь, если у вас появятся дополнительные вопросы. :-) –

+0

Переменная num является глобальной, что означает, что она может быть доступна и изменена во всех функциях скрипта. Так num изменяется в main() и в first() –

0

Это ошибка области. Во-первых, нет num, прежде чем пытаться добавить его к нему. Вы можете вызвать переменную в блоке, если она объявлена ​​в этом блоке, в верхнем блоке или объявлена ​​глобальным.

Чтобы передать переменные, вы можете использовать аргументы функции:

def first(num): 
    return num + 1 

def main(): 
    shmilblik = first(1) 
    print(shmilblik) 
0

«номер» не определен в функции «первый». Это не глобальная переменная, она выходит за рамки «первых». Чтобы сделать его глобальным, просто отредактируйте свою функцию следующим образом:

def first(): 
    global num 
    num = num + 1 

Использование глобальных переменных - это плохая практика, на мой взгляд. вы могли бы добиться того же с помощью параметров и возврата, как это:

def first(num): 
    return num + 1 

def main(num): 
    num = 1 
    num = first(num) 
    print(num) 
    return num 

num = 0 

num_result = main(num) 

print(num_result) 
+0

num был определен вне любой функции. Поэтому он должен иметь глобальный охват. –

0

переменная Num просто инициализируется в главном-метода, вы не инициализирует его в первом() - метод. Поэтому вы должны передать его первому() - методу.

def first(num): 
    return num + 1 

def main(): 
    num = 1 
    num = first(num) 
    return num 

num = 0 

num_result = main() 

print(num_result) 
+0

Я инициализировал его за пределами обеих функций, поэтому он должен иметь глобальную область видимости. –

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