列表或字典的引用:
引用針對變量的時候,傳遞引用后,對引用后的對象的值進行改變是不會影響到原值的;而列表不一樣如:
spam =42
cheese = spam
spam =100
print(spam) #out:100
print(cheese) #out:42
如果對列表進行引用會是什么情況呢,我們來看看
spam = [0,1,2,3,4,5]
cheese = spam
print(spam)
cheese[1] = 'hello'
print(spam)
print(cheese)
out:
[0, 1, 2, 3, 4, 5] [0, 'hello', 2, 3, 4, 5] [0, 'hello', 2, 3, 4, 5]
結果我們發現cheese 是引用的spam的,我們改變cheese之后 spam的值也跟着改變了;這個就跟我們當初學的C語言一樣;列表的引用其實就是相當於把前面一個列表的地址同時給了一個新的列表用。結果這兩個列表都指向了同一地址;而這個地址里面本身就只能存放一組數據,不管是對這兩個列表誰進行操作都會把這個地址中的數據重新更新;也因此列表可以用來形參的傳遞來改變實參的值,而變量不同,變量的形參傳遞是不會改變實參的值的;
def eggs(somePrameter):
somePrameter.append('Hello')
def trees(somename):
somename+='Hello'
print('形參值:'+somename)
spam = [0,1,2,3]
treename = '梧桐'
eggs(spam)
trees(treename)
print(spam)
print('實參值:'+treename)
out:
形參值:梧桐Hello [0, 1, 2, 3, 'Hello'] 實參值:梧桐
列表或字典的復制
在處理列表和字典時,盡管傳遞引用常常是最方便的方法,但如果函數修改了傳入的列表和字典,你可能不希望這些變動影響到原來的列表或字典。要做到這一點,Python提供了copy的模塊,其中包含copy()和deepcopy()函數。第一個函數copy.copy(),可以用來復制列表或字典這樣的可變值,而不是復制引用.注意這需要用到copy模塊,因此要import copy
如上示例做些許更改所示:
import copy
spam = [0,1,2,3,4,5]
cheese = copy.copy(spam)
print(spam)
cheese[1] = 'hello'
print(spam)
print(cheese)
out:
[0, 1, 2, 3, 4, 5] [0, 1, 2, 3, 4, 5] [0, 'hello', 2, 3, 4, 5]