Python基礎之六 深淺拷貝問題

2021-10-25 03:01:55 字數 2746 閱讀 3928

1、**

l1 =[1

,'晴朗',[

2,'小明']]

l2 = l1

print

(l1 is l2)

#true

l1[2][

0]=3

print

(l2)

#[1, '晴朗', [3, '小明']]4)

print

(l2)

#[1, '晴朗', [3, '小明'], 4]

3、分析

1、建立了乙個名為l1的變數,這個變數指向乙個list物件

2、把l1的值賦值給l2,那麼l2變數將指向l1變數對應的物件(記憶體位址),可以理解為,物件的賦值都是進行物件引用(記憶體位址)傳遞,也就是說"l1 is l2l",「l1[i] is l2[i]」

3、由於l1和l2指向同乙個物件,所以對l1的任何修改都會體現在l2上

1、**

l1 =[1

,'晴朗',[

2,'小明']]

l2 = l1.copy(

)print

(l1 is l2)

#false

l1[2][

0]=3

print

(l2)

#[1, '晴朗', [3, '小明']]4)

print

(l2)

#[1, '晴朗', [3, '小明']]

3、分析

1、建立了乙個名為l1的變數,這個變數指向乙個list物件

2、通過copy模組裡面的淺拷貝函式copy(),對l1指向的物件進行淺拷貝,然後淺拷貝生成的新物件賦值給l2變數

2.1、淺拷貝會建立乙個新的物件,這個例子中"l1 is not l2"

2.2、但是,對於物件中的元素,淺拷貝就只會使用原始元素的引用(記憶體位址),也就是說"l1[i] is l2[i]"

3、由於l1和l2不指向同乙個物件,但在拷貝時生成的物件與原來被拷貝物件中的元素分別指向同乙個記憶體位址,所以對l1的元素任何修改都會體現在l2上,但對l1的單獨操作不會引起l2變化(如新增元素)

1、**

import copy #匯入copy模組

l1 =[1

,'晴朗',[

2,'小明']]

l2 = copy.deepcopy(l1)

print

(l1 is l2)

#false

l1[2][

0]=3

print

(l2)

#[1, '晴朗', [2, '小明']]4)

print

(l2)

#[1, '晴朗', [2, '小明']]

3、分析

1、建立了乙個名為l1的變數,這個變數指向乙個list物件

2、通過copy模組裡面的淺拷貝函式deepcopy(),對l1指向的物件進行深拷貝,然後深拷貝生成的新物件賦值給l2變數

2.1、深拷貝會建立乙個新的物件,這個例子中"l1 is not l2"

2.2、但是,對於物件中的元素,深拷貝都會重新生成乙份,而不是簡單的使用原始元素的引用(記憶體位址)

3、由於l1和l2不指向同乙個物件,且l1和l2物件中的元素也不指向同乙個記憶體位址,所以對l1的任何修改都不會體現在l2上

1、python中物件的賦值都是進行物件引用(記憶體位址)

2、傳遞/使用copy.copy(),可以進行物件的淺拷貝,它複製了物件,但對於物件中的元素,依然使用原始的引用

3、如果需要複製乙個容器物件,以及它裡面的所有元素(包含元素的子元素),可以使用copy.deepcopy()進行深拷貝

4、對於非容器型別(如數字、字串、和其他』原子』型別的物件)沒有被拷貝一說

5、如果元祖變數只包含原子型別物件,則不能深拷貝(沒有意義,結果都一樣),看下面的例子:

import copy #匯入copy模組

t1 =(1

,'晴朗',2

,'小明'

)t2 = copy.copy(t1)

print

(t1 is t2)

#true

import copy #匯入copy模組

t1 =(1

,'晴朗',2

,'小明'

)t2 = copy.deepcopy(t1)

print

(t1 is t2)

#true

python基礎之深淺拷貝

深淺拷貝 對於字串 str 數字 int 布林型別 bool 等型別深淺拷貝都是開闢新記憶體 對於列表 list 集合 set 字典 dict 深淺拷貝可變型別都一樣,如 1,2,3 對於列表 list 集合 set 字典 dict 存在巢狀的深淺拷貝不一樣,如 1,2,3,4,5,6 淺拷貝只拷貝...

python基礎高階之深淺拷貝

深拷貝與淺拷貝的區別 淺複製shadow copy 1,只拷貝物件自身,僅僅是指向被複製的記憶體位址 2,內層列表的引用沒有拷貝,即淺拷貝拷貝的是第一層引用 3,如果原位址中物件被改變了,那麼淺複製出來的物件也會相應改變。深複製deep copy 1,開闢了一塊新的記憶體位址用於存放複製的物件 2,...

六 python的深淺拷貝

參考原文 1 數字和字串的拷貝 a1 123123 a2 123123 輸出結果是 1959780298352 1959780298352 import copy 使用淺拷貝需要匯入copy模組 a1 123123 a3 copy.copy a1 使用copy模組裡的copy 函式就是淺拷貝了 pr...