Python 引用全局基本体与对象

Python 引用全局基本体与对象,python,pointers,global,Python,Pointers,Global,有人能用Python解释一下下面的结果吗 运行以下代码片段时,Python抛出一个错误,表示变量x在赋值之前被引用: x = 1 def increase_x(): x += 1 increase_x() 当然,解决方案是在increase\ux的函数声明之后包含行global x 但是,在运行下一段代码时,不会出现错误,结果与您期望的一样: x = [2, -1, 4] def increase_x_elements(): for k in range(len(x)):

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

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

x = 1

def increase_x():
    x += 1

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

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

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的内容,而不是重新绑定它。这是因为列表是可变的,但区别不是可变的与不可变的,而是可变的与重新绑定:重新绑定可变对象会失败,就像使用整数那样。

Python中的所有内容都是对象,即使是整数。区别在于一个是可变的(列表),一个是不可变的(整数)。这就是为什么我没有试着回答,因为1)我没有喝咖啡,2)我不确定如何充分解释/我是否完全正确:P