與傳入普通變量不同,當(dāng)在python的函數(shù)參數(shù)中傳入列表時(shí)婆殿,傳入的是列表的引用,也就是說罩扇,如果在函數(shù)內(nèi)部改變了傳入的列表婆芦,則當(dāng)函數(shù)調(diào)用后,該列表也隨之改變了喂饥。舉個(gè)栗子:
定義一個(gè)參數(shù)為列表的函數(shù):
def f(x):
x.append(1)
return x
調(diào)用該函數(shù):
>>> x = [1,2]
>>> f(x)
[1, 2, 3]
>>> x
[1, 2, 3]
可知在函數(shù)調(diào)用完成后消约,傳入的列表x也隨之改變了。如果我們不想讓函數(shù)調(diào)用后改變x的值员帮,可以用拷貝功能或粮。
1.列表的拷貝與引用
在python3中,可以用列表的copy方法或索引全部元素來完成拷貝捞高;而在python2中氯材,只能用索引全部元素來完成拷貝。
>>> testList = [1,2,3]
>>> check1 = testList #把列表的引用賦給check1
>>> check2 = testList[:] #把列表的拷貝賦給check2
>>> testList.append(4) #改變?cè)斜?>>> print(check1, check2) #可知check1改變了硝岗,而check2不受影響
[1, 2, 3, 4] [1, 2, 3]
注:在python3中氢哮,除了像上面代碼中那樣引用,還能通過列表的copy方法來引用型檀,即:
check3 = testList.copy()
可用下圖來表示拷貝和引用的原理:
圖糙理不糙
我們定義了一個(gè)列表[1,2,3]冗尤,起名叫testList。列表的引用就是給它再起個(gè)名字叫做check1胀溺,雖然名字不一樣生闲,但指向的都是同一個(gè)變量,在內(nèi)存中都是同一個(gè)位置月幌。
拷貝就是在內(nèi)存中另一個(gè)位置拷貝此列表,起名叫check2悬蔽。雖然兩個(gè)變量的值都是[1,2,3]扯躺,但它們的地址卻是不同的。
除了列表蝎困,字典录语、集合和numpy庫中的matrix、array數(shù)據(jù)結(jié)構(gòu)都有拷貝和引用禾乘。與python3中的列表類型澎埠,它們也都有copy方法。
2.字典的拷貝與引用
>>> testDict = {'age':20, 'name':'Tom'}
>>> check1 = testDict #賦值testDict的引用
>>> check2 = testDict.copy() #賦值testDict的拷貝
>>> testDict['age'] = 30
>>> print(check1, check2)
{'age': 30, 'name': 'Tom'} {'age': 20, 'name': 'Tom'}
3.集合的拷貝與引用
>>> testSet = set([1,2])
>>> check1 = testSet #賦值testSet 的引用
>>> check2 = testSet.copy() #賦值testSet 的拷貝
>>> testSet.add(3)
>>> print(check1, check2)
(set([1, 2, 3]), set([1, 2]))
4.array的拷貝與引用
>>> from numpy import *
>>> testArray = array([[1,2],[3,4]])
>>> check1 = testArray #賦值testArray 的引用
>>> check2 = testArray.copy() #賦值testArray 的拷貝
>>> testArray[0,0] = 100
>>> print check1
[[100 2]
[ 3 4]]
>>> print(check2)
[[1 2]
[3 4]]
5.matrix的拷貝與引用
拷貝與引用的用法與array相同始藕。