【问题标题】:Passing argument from Parent function to nested function Python将参数从父函数传递给嵌套函数Python
【发布时间】:2013-02-03 23:06:33
【问题描述】:

这是我的代码:

def f(x):
    def g(n):
        if n < 10:
            x = x + 1
            g(n + 1)
    g(0)

当我评估 f(0) 时,会出现错误“x referenced before assignment”。

但是,当我使用 "print x" 而不是 "x = x + 1" 时,它会起作用。

似乎在g的范围内,我只能将x用作“使用事件”而不是“绑定事件”。我猜问题是 f 只传递给 g 的值 x。

我是否理解正确?如果不是,有人可以解释为什么“x = x + 1”的左侧在引用之前没有定义吗?

谢谢

【问题讨论】:

    标签: python arguments nested-loops nested-function


    【解决方案1】:

    你理解正确。在 Python 2 的嵌套范围内,您不能使用 x 进行赋值。

    在 Python 3 中,您仍然可以通过将变量标记为 nonlocal 来将其用作绑定实例;这是为此用例引入的关键字:

    def f(x):
        def g(n):
            nonlocal x
            if n < 10:
                x = x + 1
                g(n + 1)
        g(0)
    

    在 python 2 中,您有一些变通方法;使用可变的以避免需要绑定它,或(ab)使用函数属性:

    def f(x):
        x = [x]   # lists are mutable
        def g(n):
            if n < 10:
                x[0] = x[0] + 1   # not assigning, but mutating (x.__setitem__(0, newvalue))
                g(n + 1)
        g(0)
    

    def f(x):
        def g(n):
            if n < 10:
                g.x = g.x + 1
                g(n + 1)
        g.x = x  # attribute on the function!
        g(0)
    

    【讨论】:

    • 非常感谢!既是为了好的、详细的答案,也是为了g.x的使用——这绝对是一个我还没有学过python的好特性。
    【解决方案2】:

    是的,分配给名称不同于读取它们的值。除非您另有说明,否则在函数中分配的任何名称都被视为该函数的局部变量。

    在 Python 2 中,“指定其他方式”的唯一方法是使用global 语句来允许您分配给全局变量。在 Python 3 中,您还可以使用 nonlocal 语句为更高(但不一定是全局)范围内的变量赋值。

    在您的示例中,x 位于更高但非全局范围内(函数 f)。因此,在 Python 2 中无法从 g 中分配给 x。在 Python 3 中,您可以使用 g 中的 nonlocal x 语句来完成。

    【讨论】:

    • 也感谢您的及时答复!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-26
    • 2015-01-23
    相关资源
    最近更新 更多