1.Python 中的变量:是容器(bucket)还是标签(label)?
在Python中“变量”这个名称或许有点误导性,应该叫“名称”或“标签”会更准确一些。但是,似乎所有人都习惯称为“变量”了。无论叫什么名称,都应该知道Python中的变量是如何进行工作的。
对变量的常见解释就是存储值的容器,有点像个桶(bucket),当然这不算准确。对许多编程语言(如C语言)来说,这种解释是合理的。
但是,Python中的变量不是容器,而是指向Python对象的标签,对象位于解释器的命名空间中。任意数量的标签(或变量)可以指向同一个对象。当对象发生变化时,所有指向它的变量的值都会改变。
通过以下简单代码,深刻体会理解上述含义:
1 a=[1,2,3]
2 b=a
3 c=b
4 b[1]=5
5 print(a,b,c)
上述代码运行结果为:[1, 5, 3] [1, 5, 3] [1, 5, 3]
如果将变量视为容器,以上结果就说不通了。改变了一个容器的内容,另外两个容器不应该同时发生变化。但是,如果变量只是指向对象的标签,就说得通了。3个标签都指向同一个对象,若对象发生变化,则3个标签都会反映出来。
如果变量指向的是常量或不可变值,上述区别就不是十分明显了:
1 a=1
2 b=a
3 c=b
4 b=5
5 print(a,b,c)
上述代码运行结果为:1 5 1
因为变量指向的对象无法改变,所以变量的表现与两种解释均符合。实际上在第三行代码执行完毕后,a、b和c就全都指向了同一个不可更改的整数对象,其值为1。下一行代码b=5则是让 b指向整数对象5,但a和c的指向没有变化。