无法从关闭访问父字符串?

时间:2016-03-05 22:54:19

标签: python closures

我有一些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的新手,所以如果我在这里留下了什么,请告诉我。

2 个答案:

答案 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()