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在第二个片段中引用了指向列表对象的指针?
正如 Ffisegydd 指出的那样,Python 中不存在原语这样的东西:一切都是对象。
然而,您应该注意,您在这两个片段中做了两件完全不同的事情。在第一个中,您将重新绑定x到 x+1 的值。通过尝试分配给 x,您已使其具有本地作用域,因此对 x+1 的引用失败。
在第二个片段中,您正在修改 x 的内容,而不是重新绑定它。这是可行的,因为列表是可变的,但区别不是可变与不可变,而是可变与重新绑定:重新绑定可变对象会失败,就像使用整数一样。