引用全局基元与对象

Referencing global primitives vs. objects

有人可以解释 Python 中的以下结果吗?

当运行下面的代码片段时,Python 抛出一个错误,指出变量 x 在赋值之前被引用:

x = 1

def increase_x():
    x += 1

increase_x()

当然,解决方案是在 increase_x.

的函数声明之后包含行 global x

然而,当运行下一段代码时,没有错误,结果如您所愿:

x = [2, -1, 4]

def increase_x_elements():
    for k in range(len(x)):
        x[k] += 1

increase_x_elements()

这是因为整数是 Python 中的原语(而不是对象)所以第一个片段中的 x 是存储在内存中的原语,而第二个片段中的 x 引用指向列表对象的指针?

正如 Ffisegydd 指出的那样,Python 中不存在原始类型:一切皆对象。

但是您应该注意,您在这两个片段中做的是两件完全不同的事情。首先,您将 x 重新绑定到 x+1 的值。通过尝试分配给 x,您已将其设为本地范围,因此您对 x+1 的引用失败。

在第二个片段中,您正在修改 x 的内容,而不是重新绑定它。这是可行的,因为列表是可变的,但区别不在于可变与不可变,而是可变与重新绑定:重新绑定可变对象会失败,就像使用整数一样。

In Python, variables that are only referenced inside a function are implicitly global. 这就是下面代码有效的原因。

x = 1

def increase_x():
    print(x + 1)

increase_x()

但是,If a variable is assigned a value anywhere within the function’s body, it’s assumed to be a local unless explicitly declared as global.在您的第一个示例中,由于此 x += 1 分配,x 不再是全局的。