有如下一段代码:
spam=42 cheese=spam spam=20 print(spam) print (cheese)输出结果为:
42
20
将42赋给spam变量,然后拷贝spam中的值,将它赋给变量cheese,当稍后改变spam的值不会影响到cheese的值,这是因为spam和cheese是两个不同的变量,保存了不同的值。
但是列表不是这样的,当你将列表赋给一个变量的时候,实际上是将列表的引用赋给了该变量,引用是一个值,指向某些数据。列表引用是指向一个列表的值。这有些代码,会更加容易理解这个概念。
spam=[0,1,2,4,5,6] cheese=spam cheese[1]='hello' print spam print cheese输出结果为:
[0, 'hello', 2, 4, 5, 6]
[0, 'hello', 2, 4, 5, 6]
代码只改变了cheese列表,但似乎cheese和spam列表同时发生了改变,当创建表的时候,你将对它的引用赋给了变量,但下一行只是将spam中的列表引用拷贝到了cheese,而不是列表值本身。这意味着存储在spam和cheese中的值指向了同一个列表。底下只有一个列表,因为列表本身实际从未复制,所以当你修改cheese变量的第一个元素时,实际就是修改了表,所以spam的值发生了变化。