2016-03-05 3 views
0

У меня есть питон код, где я пытаюсь получить доступ к строке в родительской области от закрытия, но всякий раз, когда я пытаюсь получить доступ к нему, я получаю ошибку:Не удается получить доступ к родительской строке из закрытия?

UnboundLocalError: local variable 'my_string' referenced before assignment

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

Я создал упрощенную версию кода, который демонстрирует проблему:

def test(): 
    def f1(): 
     print my_list 
     print my_string 
     my_string += "test" 
    my_string = "1" 
    my_list = [1,2,3] 
    f1() 
test() 

Когда я выполняю это я получаю выход:

[1, 2, 3] 
Traceback (most recent call last): 
    File "test.py", line 9, in <module> 
    test() 
    File "test.py", line 8, in test 
    f1() 
    File "test.py", line 4, in f1 
    print my_string 
UnboundLocalError: local variable 'my_string' referenced before assignment 

Почему я смог получить доступ к списку, но не Струна? Как я могу получить доступ к моей строке из моего закрытия?

Я новичок в python и закрытии, поэтому, если я что-то оставил, пожалуйста, дайте мне знать.

ответ

1

Это потому, что вы не можете изменять нелокальные переменные, не объявляя, что это то, что вы хотите. my_string не является локальной переменной, поэтому вам нужно объявить, что вы хотите изменить его в любом случае. В Python3 вы можете поставить nonlocal mystring в начале f1(). В Python2 вам нужно сделать глобальную переменную. Для этого вам нужно global mystring в начале test()и в начале f1().

+0

Спасибо за информацию. Я всегда слышал, что использование 'global' было большим нет-нет, вы думаете, что использование этого здесь было бы лучшим решением? Кроме того, почему моя переменная списка доступна, когда я использую ее точно так же, как моя строковая переменная? –

+0

Я думаю, лучшим решением было бы вернуть строку вместо этого и добавить в 'my_string' вне' f1() '. Вызов 'print' на самом деле не проблема. Если вы удалите 'my_string + =" test "', вы увидите, что он отлично печатает. Извините, хотя я не могу сказать, почему он указывает на эту строку в SyntaxError. – zondo

0

Измените переменную my_string на список или любые другие типы объектов, чтобы получить желаемое поведение. Проблема с использованием str-vs. list. Ничего общего с закрытием. Проверка базовых clases СИЛ и список показывает разницу

>>> import inspect 
>>> inspect.getmro(str) 
(<type 'str'>, <type 'basestring'>, <type 'object'>) 
>>> inspect.getmro(list) 
(<type 'list'>, <type 'object'>) 
>>> #taking one step further 
... 
>>> s = 'hello' 
>>> s[0] 
'h' 
>>> s[0] = 'y' 
Traceback (most recent call last): 
File "<stdin>", line 1, in <module> 
TypeError: 'str' object does not support item assignment 
>>> 

вставить строку «печать местных жителей()» во внутреннем f1 и обратите внимание, что my_string даже не местный печати «# f1: местные», местные жители()

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