我有一些python代码,我试图从闭包中访问父作用域中的字符串,但每当我尝试访问它时,我都会收到错误:
UnboundLocalError:局部变量' my_string'以前引用过 分配
同样奇怪的是,我在与字符串相同的范围内定义了一个列表,但是访问那个变量没有问题。
我创建了一个简化版本的代码来演示问题:
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和closures的新手,所以如果我在这里留下了什么,请告诉我。
答案 0 :(得分:1)
这是因为你不能在不声明那就是你想要的情况下修改非局部变量。 my_string
不是局部变量,因此您需要声明要修改它。在Python3中,您可以将nonlocal mystring
放在f1()
的开头。在Python2中,您必须使其成为全局变量。为此,您需要在global mystring
的开头test()
和<{1}}开头的。
答案 1 :(得分:0)
将my_string变量更改为list或任何其他对象类型以获得所需的行为。使用str与列表是个问题。与闭包无关。 检查str和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
>>>
插入一行&#34;打印当地人()&#34;在内部f1中,注意my_string甚至不是本地的 print&#39;#f1:locals&#39;,locals()