深拷貝、淺拷貝以及引用傳遞和按值傳遞的區別與聯絡
阿新 • • 發佈:2019-01-30
python的值傳遞不會改變傳入引數的值,而引用傳遞傳入的是一個地址。有點相似c的指標。在執行完畢之後會改變傳入地址所指的值。
值傳遞型別例如以下:
上面的程式碼僅僅是將a的值作為引數傳遞進去。程式執行完之後a的值並未改變
1 2 3 4 5 6 |
a = 1
def change_integer(a):
a = a + 1
return a
print change_integer(a)
print a
|
結果:
2
1
[Finished in 0.1s]
引用傳遞的型別例如以下:
1 2 3 4 5 6 7 |
b = [ 1 , 2 , 3 ]
def change_list(b):
b[ 0 ] = b[ 0 ] + 1
return b
print change_list(b)
print b
|
結果:
[2, 2, 3]
[2, 2, 3]
[Finished in 0.1s]
所謂的深拷貝其實就是不破壞原來的資料,也就是為所謂的按值傳遞
所謂的淺拷貝其實就是C語言裡面的引用,新變數和原變數用的相同地址,也就是所謂的引用傳遞
而這裡將b的地址傳遞進去之後,程式執行完之後b的值也隨之改變。
怎樣解決 變數 : 由 引用傳遞 變為 值傳遞??
方案例如以下:
1 2 3 4 5 6 7 8 9 |
import copy
b = [ 1 , 2 , 3 ]
def change_list(b):
b[ 0 ] = b[ 0 ] + 1
return b
print change_list(copy.deepcopy(b))
print b
|
結果:
[2, 2, 3]
[1, 2, 3]