python - 为什么我可以通过调用对象的方法来编辑对象,但不能在较小的范围内引用它们的变量名

标签 python scope

我的 main() 函数是:

def main():
    ...
    def _help():
        ...
1       a += somelist
2       a.append(something)

    a=[]
    _help()

奇怪的是,第 2 行 工作得很好,但第 1 行 抛出了一个 UnboundLocalError: 赋值前引用了局部变量 'a'。

即使我在 main_help 顶部将 a 声明为全局变量,它仍然不起作用。这是为什么?
这两行都在编辑相同的变量,这让我认为它们要么都起作用,要么都不起作用。如何让第 1 行工作?

最佳答案

每当您使用<variable> = <something>时在 Python 中,Python 自动假定它是局部变量,除非另有明确说明。

例如:

a = 1
def f():
    if False:
        a = 0
    print(a)  # UnboundLocalError
f()

在本例中,+=也可以用作分配,但是 .append不分配给a ,但调用一个方法。

通过放置 nonlocal a 可以解决此问题在你的函数中,所以它可以分配给 a超出其范围:

def main():
    ...
    def _help():
        nonlocal a
        a += somelist  # Works!

但在这种情况下,你可以这样做 a.extend(somelist) .

关于python - 为什么我可以通过调用对象的方法来编辑对象,但不能在较小的范围内引用它们的变量名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44598567/

相关文章:

javascript - javascript中的作用域表现得很奇怪

java - 为什么java在使用未初始化变量时会区别对待类作用域和方法作用域?

c - 需要解释奇数 for 循环/作用域问题

python - 如何在 django oscar 中设置 Paypal 重定向 url?

python - Django 序列化器 Imagefield 以获取完整的 URL

python - Theano 无法导入 pygpu/cudnn(macOS、CUDA 8)

python - 处理 python 异常的更干净的方法?

c++ - 如何访问多个级别的重写元素?

ruby - 外部异常访问的局部变量

python - 遍历 JSON 中的字符串数组