引用
當物件是不可變型別的時候,int、float、double、string、tuple(純tuple),遇到「引用」問題時,雖然起初兩個變數指向同乙個記憶體位址,但是改變了其中乙個值,並不會影響另外乙個(會重新開闢記憶體位址)。
當物件是可變型別的時候,list、dic,遇到「引用」問題,會一直共享一塊記憶體位址,改變了其中乙個,另外乙個也就改變了。
#1 不可變數,更改後記憶體位址發生改變
a = 1
b = a
a = a+1
print('values {} id {}'.format(a,id(a)))
print('values {} id {}'.format(b,id(b)))
output:
values 2 id 1545235968
values 1 id 1545235936
# 2 可變型別,更改後記憶體位址不變
l1 = [1,2,[3,4],5]
l2 = l1
print(id(l1))
print(id(l2))
print(l2)
#output:
911276241736
911276241736
[1, 2, [3, 4], 5, 6]
淺拷貝(shallow copy):指重新分配一塊記憶體,建立乙個新的物件,裡面的元素是原物件中子物件的引用。
三種淺拷貝的方法:
import copy
l1 = [1,2,[3,4],5]
#1 利用[:]
l2 = l1[:]
print('1: {} \t {}'.format(id(l1),id(l2)))
#2 利用copy.copy()
l2 = copy.copy(l1)
print('2: {} \t {}'.format(id(l1),id(l2)))
#3 利用list.copy()
l2 = l1.copy()
print('3: {} \t {}'.format(id(l1),id(l2)))
output:
1: 911276084616 911247796040
2: 911276084616 911276277704
3: 911276084616 911247796040
它會有乙個問題,就是更改list中的list結構,會使整體改變。
l1 = [1,2,[3,4],5]
l2 = l1[:]
#1 淺層更改
print('1: {} \t {}'.format(l1,l2))
output:
1: [1, 2, [3, 4], 5, 6] [1, 2, [3, 4], 5]
#2 深層更改
print('2: {} \t {}'.format(l1,l2))
output:
2: [1, 2, [3, 4, 6], 5] [1, 2, [3, 4, 6], 5]
我的理解就是:
不可變的就是不可變,可變的裡面如果是可變的那就是可變,可變的裡面不可變那就是不可變。
深拷貝:是指重新分配一塊記憶體,建立乙個新的物件,並且將原物件中的元素,以遞迴的方式,通過建立新的子物件拷貝到新物件中。因此,新物件和原物件沒有任何關聯。
import copy
l1 = ['a',['b','c'],'d']
l2 = copy.deepcopy(l)
print(l1)
print(l2)
output:
['a', ['b', 'c'], 'd']
['a', ['b', 'c', 'm'], 'd']
所以涉及到列表的巢狀結構的時候,還是用deepcopy()比較好,以防萬一。
參考:
Python深拷貝 淺拷貝 引用
列表巢狀 如果想拷貝之後賦值的變數不想影響之前的列 表變數import copy 反之copy usr bin env python coding utf 8 author mxl time 2020 3 17 import copy a 1,2,3 b a a print a的初始值為 str a...
Python引用 淺拷貝 深拷貝
1 概念 深拷貝 將父和子的值都進行傳遞,無論怎麼去修改源變數,深拷貝的變數都和源變數無關 2 引用 我們建立乙個變數a,通過引用將a賦值給變數b,使用id 檢視變數位址,a與b得位址一致,可見兩者此時指向同意記憶體位址,當我們改變a得值時,b得值也會變化。引用示例 a 1 b a print id...
Python 引用 淺拷貝 深拷貝解析
1 的作用。僅僅是位址的引用,當原列表或者新列表中任意元素改變,均會對另外乙個產生影響 引用 本例中屬於位址的引用,其中a和b共用同一塊記憶體 當修改共用記憶體中的任意的內容是時,均會影響到另外的內容 a 0,1,2,3,4 b a 修改a 0 後,a 0 和b 0 都會改變 a 0 10 prin...