引用全局原语与对象

时间:2015-01-06 09:44:39

标签: python pointers global

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

运行以下代码片段时,Python会抛出一个错误,说在分配之前引用了变量x

x = 1

def increase_x():
    x += 1

increase_x()

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

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

x = [2, -1, 4]

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

increase_x_elements()

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

1 个答案:

答案 0 :(得分:3)

正如Ffisegydd指出的那样,Python中没有基本原则:一切都是对象。

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

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