代码之家  ›  专栏  ›  技术社区  ›  deppep

一个函数返回另一个函数。为什么里面的函数可以从父对象定义一个列表而不是一个常量?

  •  0
  • deppep  · 技术社区  · 4 年前

    考虑这个函数:

    def g():
        x = []
        
        def f():
            x.append([0])
            print(x)
            pass
        return f
    

    称之为:

    test = g()
    test()
    

    Out: [[0]]
    

    我们可以重新初始化测试函数并多次调用它:

    test = g()
    for i in range(3):
        test()
    

    产生以下输出:

    Out: [[0]]
    [[0], [0]]
    [[0], [0], [0]]
    
    

    但是,定义以下函数:

    def j():
        x = 1
        def f():
            x += 1
            print(x)
            pass
        return f
    

    并称之为:

    test = j()
    test()
    

    UnboundLocalError: local variable 'x' referenced before assignment
    

    列表似乎在内部函数范围内,而值不在。为什么会这样?

    0 回复  |  直到 4 年前
        1
  •  1
  •   QuarticCat    4 年前

    @拉萨尔清楚地解释了原因。这里我给出一个解决方案:

    def j():
        x = 1
        def f():
            nonlocal x
            x += 1
            print(x)
            pass
        return f
    

    += 看起来像一个有界方法调用,一个就地操作(如果你有其他语言的经验)。但下面运行的是 x = x.__add__(1) x = x.__iadd__(1) . 所以这是一项任务。

        2
  •  1
  •   rassar    4 年前

    这是因为 j 使用赋值表达式,其中 g x += 1 相当于 x = x + 1 收件人:

    def g():
        x = []
    
        def f():
            x += [[0]]
            print(x)
            pass
        return f
    

    >>> test = g()
    >>> test()
    Traceback (most recent call last):
      File "<pyshell#20>", line 1, in <module>
        test()
      File "<pyshell#18>", line 5, in f
        x += [[0]]
    UnboundLocalError: local variable 'x' referenced before assignment
    
        3
  •  0
  •   ZaO Lover    4 年前