python中深淺拷貝學習

2021-09-02 19:32:19 字數 1518 閱讀 4081

好記性不如爛筆頭。

對於常數的拷貝,類似於數值的位址是一定,當進行賦值時,先共用乙個記憶體,如果一方修改了內容,則該方的位址改變,從而使得兩個變數不再相同,即一方修改另一方不會修改。

a = 2

b = a

print( "a = {}, b = {}".format(a, b) )

## result

## a = 2, b = 2

print( "id(a) = {}, id(b) = {}".format(id(a), id(b)) )

## result

## id(a) = 1427401776, id(b) = 1427401776

a = 3

print( "a = {}, b = {}".format(a, b) )

## result

## a = 3, b = 2

print( "id(a) = {}, id(b) = {}".format(id(a), id(b)) )

## result

## id(a) = 1427401808, id(b) = 1427401776

如果直接賦值拷貝,進行的是淺拷貝。

python2中需要使用b = copy.copy(a)才能賦值,如果是python3則直接使用b  = a.copy()即可賦值。

如果使用copy()使用,需要看是資料的型別才能決定是深拷貝還是淺拷貝。

如果是單個list,如a = [1, 2, 3],使用 b = a.copy() 或者 b = copy.copy(a)進行的可以理解為深拷貝,因此改變b中的值,a的值不會改變。但是如果是複雜的list,如a  = [ [1, 2], [3, 4] ],如果使用b = a.copy() 或者 b = copy.copy( a )進行的是淺拷貝,如果需要進行深拷貝需要,b = copy.deepcopy( a )。

總結:如果想使用深拷貝,建議直接使用b = copy.deepcopy( a ),以免出現不必要的錯誤。

import numpy as np

a = [1, 2, 3]

b = a

print( "id(a) = {}, id(b) = {}".format(id(a), id(b)) )

## result

## id(a) = 57435528, id(b) = 57435528

b[0] = 10

print( "id(a) = {}, id(b) = {}".format(id(a), id(b)) )

## result

## id(a) = 57435528, id(b) = 57435528

b = a.copy()

print( "id(a) = {}, id(b) = {}".format(id(a), id(b)) )

## result

## id(a) = 57435528, id(b) = 57435656

python中深淺拷貝

先弄懂下面概念 變數 引用 物件 可變物件,不可變物件 切片 拷貝 淺拷貝,深拷貝 變數是乙個系統表的元素,擁有指向物件的鏈結的空間 物件是被分配的一塊記憶體,儲存其所代表的值 引用是自動形成的從變數到物件的指標 在python中不可變物件知 一旦建立就不可修改物件,包括字元創,元組,數字 在pyt...

Python 中的深淺拷貝

python 中的物件之間賦值時,時按照引用傳遞,如果需要拷貝物件 需要使用標準庫中的copy模組 1.copy.copy淺拷貝 只拷貝父物件,不會拷貝物件的內部的子物件 2.copy.deepcopy深拷貝 拷貝物件及其子物件 示例 encoding utf 8 import copy a 1,2...

python中的深淺拷貝

深淺拷貝 定義 1.淺拷貝 拷貝了最外層的物件,內部的元素只拷貝了乙個引用 2.深拷貝 外層的物件和內部的元素都拷貝 賦值 了一遍 術語 1.變數 是乙個系統表的元素,擁有指向物件的連線空間 2.物件 會在記憶體中占用一塊空間 3.引用 是自動形成的從變數到物件的指標 首位址,引用 4.型別 物件型...