在局部函数作用域中使用的全局语句 [duplicate]

Global statements used within a local function scope [duplicate]

提问人:Christian 提问时间:8/11/2021 最后编辑:Paul M.Christian 更新时间:8/11/2021 访问量:31

问:

虽然我完全了解 LEGB 规则是如何工作的,但直到我遇到这个。从本质上讲,我将访问我的函数本地命名空间中的“total”变量。我知道“total 变量是一个本地命名空间,但无论出于何种原因,当我尝试运行此函数时,我都会收到以下错误: UnboundLocalError:赋值前引用的局部变量“total”

例:

total = 0

def two_digit_sum(n):
    for i in str(n):
        total += int(i)
    return total


number = 111
print(two_digit_sum(number))

但是,当我使用以下功能时,我没有遇到错误 例:

def spam():
    print(eggs)


eggs = 42
spam()

^^^ 正如你所看到的,eggs 变量也是一个全局函数。

Python 函数 命名空间

评论

1赞 Samwise 8/11/2021
您可以从外部作用域读取(甚至更改)变量,而无需执行任何特殊操作,但不能重新分配外部作用域的名称。第一个函数重新分配,第二个函数不重新分配。totaleggs
0赞 Karl Knechtel 8/11/2021
“我知道”总变量是本地命名空间“,那么我想我不明白你为什么感到困惑。如果删除该行,您是否希望代码能够正常工作?如果你是写的而不是一开始就写的呢?如果还没有单独定义,你会期望它起作用吗?total = 0total += 0total = 0total
0赞 Christian 8/11/2021
@KarlKnechtel,这完全是一个错别字。我的意思是说我知道“total”变量是一个全局名称空间
0赞 Karl Knechtel 8/11/2021
啊,好吧。然后,链接的副本应该回答您的问题。
0赞 juanpa.arrivillaga 8/11/2021
在这种情况下,@Samwise小心使用“突变”一词。您不能从外部作用域更改变量 - 更改变量通常等同于分配/重新分配它。当然,您可以改变变量引用的对象

答:

0赞 Ali Saad 8/11/2021 #1

我认为你所做的是你已经为函数内部提供了值,所以你必须把它变成一个.totalglobal variable

但是在鸡蛋中,您没有做任何新值,只是打印了它。

此代码是您的问题的解决方案。


total = 0

def two_digit_sum(n):
    global total

    for i in str(n):
        total += int(i)
    return total


number = 111
print(two_digit_sum(number))

但是,如果您在函数内部给出了值,则会出现错误。eggsspam

def spam():
    eggs += 1 
    print(eggs)
    
eggs = 42
spam()

在这里,您已经为它创造了价值。