引用全局原语与对象

Rya*_*yan 5 python pointers global

有人可以用Python解释一下下面的结果吗?

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

x = 1

def increase_x():
    x += 1

increase_x()
Run Code Online (Sandbox Code Playgroud)

当然,解决方案是global x在 的函数声明之后包含该行increase_x

但是,当运行下一段代码时,没有错误,结果正如您所期望的:

x = [2, -1, 4]

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

increase_x_elements()
Run Code Online (Sandbox Code Playgroud)

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

Dan*_*man 6

正如 Ffisegydd 指出的那样,Python 中不存在原语这样的东西:一切都是对象。

然而,您应该注意,您在这两个片段中做了两件完全不同的事情。在第一个中,您将重新绑定x到 x+1 的值。通过尝试分配给 x,您已使其具有本地作用域,因此对 x+1 的引用失败。

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