#淺拷貝在內存中只額外建立第一層數據 import copy D = {'k1': 'he', 'k2': 123, 'k3': ['morra', 456]} n2 = copy.copy(D) # 拷貝方式一 n2 = dict(D) # 拷貝方式二 # 對於列表來講還有以下幾種拷貝方式 L = [1, 2, [2, 3]] n2 = L[:] n2 = list[L] n3 = [x for x in L] #經過列表推倒式建立
在使用淺拷貝時,對象內部的屬性和內容仍然引用原始對象,這樣的操做速度很快,並且節省內存。python
#在內存中將全部的數據建立一份(最後一層數據除外,這是由python內部對字符串和數字類型的優化致使的) import copy n1 = {'k1': 'he', 'k2': 123, 'k3': ['morra', 456]} n2 = copy.deepcopy(n1)
若是須要拷貝一些容器對象,還必須遞歸地拷貝其內部引用的對象。這種深拷貝操做會消耗至關的時間和內存。函數
def func(b): b = 'spam' a = 3 func(a) print(a) # 結果是3
以上的參數傳遞過程可簡化爲一下步驟:優化
a = 3 b = a b = 'spam'
多個變量名引用了同一引用,也叫作"共享引用":spa
b = 'spam' #這個賦值運算改變的不是對象3,只是改變了變量a,而變量b並無發生變化,因此上面的運行結果是3code
因此咱們通常說,str、int等不可變(immutable)對象的傳遞方式爲值傳遞。對象
引用傳遞就很好理解了:blog
def func(b): b[0] = 'spam' a = [3] func(a) print(a) # 結果是['spam']
對於list、dict這些書可變(mutable)對象而言,因爲變量引用的是「對底層不可變數據的引用」,因此這些對象的傳遞方式每每是引用傳遞。遞歸