【问题标题】:Python lets you access a list, but not an int from an nested inner function?Python 允许您访问列表,但不能访问嵌套内部函数中的 int?
【发布时间】:2022-01-12 05:49:23
【问题描述】:
def func1():
    nums = [1,3]
    j = 1
    def func2(k):
        nums.append(k)
        print(nums)
        j = j + k
        print(j)
    func2(5)
func1()

我了解传递给外部函数 func1() 的所有参数都将可供其内部函数 func2() 使用。当涉及到外部函数内部定义的变量时,例如上面的numsj,我只能访问/修改列表而不是 int。我得到以下输出:

    [1, 3, 5]
Traceback (most recent call last):
  File "<input>", line 10, in <module>
  File "<input>", line 9, in func1
  File "<input>", line 7, in func2
UnboundLocalError: local variable 'j' referenced before assignment

我们可以看到参数被附加到输出中的nums,但是当它到达j = j + k 时会抛出一个错误。集合和字典也是如此,它们可以从内部函数访问。为什么我不能访问int,但我可以访问列表,即使它们定义在同一个范围内?

【问题讨论】:

标签: python function scope nested


【解决方案1】:

问题在于,当您在 func2 内分配给 j 时,您正在该函数内创建一个新的局部变量。然后,Python 尝试在赋值的右侧引用该局部变量 (j),但仍然找不到分配给它的任何值。

一种可能的解决方案是在j 上使用nonlocal 关键字,如下所示:

def func1():
    nums = [1,3]
    j = 1
    def func2(k):
        nonlocal j
        nums.append(k)
        print(nums)
        j = j + k
        print(j)
    func2(5)
func1()

哪个产生

[1, 3, 5]
6

这篇文章是相关的,可能会让你更清楚:Python 3: UnboundLocalError: local variable referenced before assignment

还有来自 Python 文档的更多信息:https://docs.python.org/3/faq/programming.html#why-am-i-getting-an-unboundlocalerror-when-the-variable-has-a-value

【讨论】:

    【解决方案2】:
    def func2(j, k)
    

    然后调用它:

    func2(j, 5)
    

    当我像这样测试它时工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-23
      • 1970-01-01
      • 2018-07-16
      相关资源
      最近更新 更多