>>> spam=0
>>> cheese=spam
>>> spam=1
運(yùn)行后,cheese的值是0還是1澄惊?
>>> spam
1
>>> cheese
0
但換成列表后唆途,其結(jié)果有何不同呢富雅?
1>>> spam=[1,2,3]
2>>> cheese=spam
3>>> cheese[1]='Hi'
>>> spam
[1, 'Hi', 3]
>>> cheese
[1, 'Hi', 3]
為何改了cheese列表,spam列表同時(shí)改變了呢肛搬?
這是因?yàn)?中列表賦值没佑,是將列表的引用賦給了變量spam。2中只是將spam中的列表引用拷貝到cheese温赔,而不是拷貝列表值本身蛤奢。即存在spam和cheese中的值,指向了同一個(gè)列表陶贼。所以3中修改cheese變量的元素時(shí)啤贩,也修改了spam指向的同一個(gè)列表。
總之痹屹,變量保存可變的數(shù)據(jù)類型的值,如列表和字典枉氮,就使用引用志衍。對(duì)于不可變的數(shù)據(jù)類型的值,如字符串聊替、整型或元組足画,變量就保存值本身。
但若想復(fù)制列表的值佃牛,而不是復(fù)制列表的引用淹辞,又該如何做呢?
這涉及到copy模塊的copy()和deepcopy()函數(shù)俘侠。copy()復(fù)制簡(jiǎn)單的列表象缀,若列表中又含列表,則要用deepcopy()爷速。
>>> import copy
>>> spam=[1,2,3]
>>> cheese=copy.copy(spam)
>>> cheese[1]='Hi'
>>> spam
[1, 2, 3]
>>> cheese
[1, 'Hi', 3]