关于python:引用全局原语与对象

 2019-06-02 

Referencing global primitives vs. objects

有人能用python解释一下下面的结果吗?

当运行以下代码片段时,python抛出一个错误,表示变量x在赋值之前被引用:

1
2
3
4
5
6
x = 1

def increase_x():
    x += 1

increase_x()

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

但是,在运行下一段代码时,不会出现错误,结果是您所期望的:

1
2
3
4
5
6
7
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的内容,而不是重新绑定它。这是因为列表是可变的,但是区别不是可变的和不可变的,而是可变的和重新绑定的:重新绑定可变对象将失败,就像使用整数一样。