python 引用,淺拷貝,深拷貝

2021-10-01 06:28:57 字數 2063 閱讀 4704

引用

當物件是不可變型別的時候,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...