2013-06-19 3 views
0

Я использую Python2.7 и все еще довольно смущен тем, что просматривает python. Я не могу объяснить, почему ситуация может произойти. Кто-то может мне помочь. Заранее спасибо.Область применения в Python

Случай 1:

x = 1 
def func(): 
    print x 

func() 

=> Результат:

1 

Случай 2:

x = 1 
def func(): 
    print x 
    x = 9 
func() 

=> Результат:

UnboundLocalError: local variable 'x' referenced before assignment 

Когда я добавляю строку x = 9 в случае 2, произошла ошибка.

+0

Пожалуйста, смотрите здесь: http://stackoverflow.com/questions/17142544/python-single-integer-variable-between-function/17142816#17142816 Я не знаю, как отметить дублирующее: < – enpenax

+0

@ user2033511: У вас недостаточно репутации, чтобы сделать это, но не беспокойтесь; вы сделали следующее лучшее. –

ответ

1

В случае, если вы переназначить внешнюю переменную в методе, вы должны использовать глобальный:

x = 1 
def func(): 
    global x 
    print x 
    x = 9 
func() 

В случае изменяемых переменных (например, список или словарь), когда вам просто нужно изменить внутреннее состояние (list.append, list.pop) - вам не нужно глобальное ключевое слово.

+1

Неизменяемость имеет ** ничего ** делать с этим. Назначение переменной ('x = ...') * всегда * ведет себя таким образом (т. Е. Создает новый локальный). Некоторые операции возможны только для изменяемых объектов, таких как назначение элемента ('x [0] = ...'), работают по-другому, но это не должно удивлять, поскольку они являются разными операциями. – delnan

+0

В этом случае я вижу int неизменяемым и список/dict как изменяемый тип. Может быть, именование не является на 100% точным в этом случае, но оно хорошо описывает ситуацию, imho. – StKiller

+0

Ваши примеры изменчивых и неизменных в основном правильны, я говорю, что не имеет значения, являются ли задействованные объекты изменчивыми. То есть квалификация «непреложна» бессмысленна, запутанна и чрезмерно ограничительна. OP получит ту же самую ошибку, независимо от того, какие объекты назначены 'x' внутри и вне' func' (попробуйте - 1 и 9 с произвольными изменяемыми объектами). – delnan

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