引用,Python中拷贝列表时,变量里存的是什么

>>> spam=0
>>> cheese=spam
>>> spam=1

运行后,cheese的值是0还是1?

>>> spam
1
>>> cheese
0

但换成列表后,其结果有何不同呢?

1>>> spam=[1,2,3]
2>>> cheese=spam
3>>> cheese[1]='Hi'
>>> spam
[1, 'Hi', 3]
>>> cheese
[1, 'Hi', 3]

为何改了cheese列表,spam列表同时改变了呢?
这是因为1中列表赋值,是将列表的引用赋给了变量spam。2中只是将spam中的列表引用拷贝到cheese,而不是拷贝列表值本身。即存在spam和cheese中的值,指向了同一个列表。所以3中修改cheese变量的元素时,也修改了spam指向的同一个列表。


cheese=spam复制了引用,而非列表

总之,变量保存可变的数据类型的值,如列表和字典,就使用引用。对于不可变的数据类型的值,如字符串、整型或元组,变量就保存值本身。

但若想复制列表的值,而不是复制列表的引用,又该如何做呢?
这涉及到copy模块的copy()和deepcopy()函数。copy()复制简单的列表,若列表中又含列表,则要用deepcopy()。

>>> import copy
>>> spam=[1,2,3]
>>> cheese=copy.copy(spam)
>>> cheese[1]='Hi'
>>> spam
[1, 2, 3]
>>> cheese
[1, 'Hi', 3]
cheese=copy.copy(spam)创建了第二个列表,修改不会影响原来的列表

你可能感兴趣的:(引用,Python中拷贝列表时,变量里存的是什么)