有人可以在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
引用了一个指向列表对象的指针?
答案 0 :(得分:3)
正如Ffisegydd指出的那样,Python中没有基本原则:一切都是对象。
但是你应该注意到你在这两个片段中正在做两个完全不同的事情。在第一个中,您将x
重新绑定到x + 1的值。通过尝试分配给x,您已将其设置为本地作用域,因此您对x + 1的引用失败。
在第二个片段中,您正在修改x的内容,而不是重新绑定它。这是有效的,因为列表是可变的,但差异不是可变的vs不可变的但是变异与重新绑定:重新绑定可变对象会失败就像使用整数一样。