拷貝與傳參

1 拷貝

1.1 淺拷貝

#淺拷貝在內存中只額外建立第一層數據
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

1.2 深拷貝

#在內存中將全部的數據建立一份(最後一層數據除外,這是由python內部對字符串和數字類型的優化致使的)
import copy

n1 = {'k1': 'he', 'k2': 123, 'k3': ['morra', 456]}
n2 = copy.deepcopy(n1)

若是須要拷貝一些容器對象,還必須遞歸地拷貝其內部引用的對象。這種深拷貝操做會消耗至關的時間和內存。函數

2 函數參數傳遞

2.1 值傳遞

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)對象的傳遞方式爲值傳遞。對象

2.2 引用傳遞

引用傳遞就很好理解了:blog

def func(b):
    b[0] = 'spam'  
a = [3]
func(a)
print(a) # 結果是['spam']

對於list、dict這些書可變(mutable)對象而言,因爲變量引用的是「對底層不可變數據的引用」,因此這些對象的傳遞方式每每是引用傳遞。遞歸

相關文章
相關標籤/搜索