Python基礎之賦值,淺拷貝,深拷貝的區別

2022-09-25 19:24:12 字數 4046 閱讀 3600

不會開闢新的記憶體空間,只是複製了新物件的引用。所以當乙個資料發生變化時,另外乙個資料也會隨之改變。

建立新物件,其內容是對原物件的引用。淺拷貝之所以稱為淺拷貝,是因為它僅僅只拷貝了第一層,即只拷貝了最外層的物件本身,內部的元素都只是拷貝了乙個引用而已,即內部元素如果被修改,則另外乙個資料也會發生變化。

淺拷貝的三種形式:

a = [1, 2, 3, 4]

# 第1種

b = a[:]

# 第2種

b = [a for a in a]

b = list(a)

b = copy.copy(a)

淺拷貝要分兩種情況進行討論:

1)當淺拷貝的值是不可變物件(例程式設計客棧如字串、元組、數值型別)時,和賦值情況一樣,物件的記憶體位址(id())與淺拷貝原來的值一致。

2)當淺拷貝的值是可變物件(例如列表、字典、集合等)時,也需要分兩種情況討論:

首先,原來值的記憶體位址與拷貝後的記憶體位址不同。

深拷貝拷貝出來的物件是乙個全新的物件,和原來的物件沒有任何的關聯。改變原有物件不會影響新的拷貝物件。

import copy

# 不可變物件

# a = (1, 2, 'hello') # 元組

# a = 1 # 數值

a = 'hello' # 字串

print("********賦值********")

程式設計客棧b = a

print(id(a))

print(id(b))

print(a)

print(b)

print("********淺拷貝********")

b = copy.copy(a)

print(id(a))

print(id(b))

print(a)

print(b)

print("********深拷貝********")

b = copy.deepcopy(a)

print(id(a))

print(id(b))

print(a)

print(b)

結果:********賦值********

1894005658264

1894005658264

hello

hello

********淺拷貝********

1894005658264

1894005658264

hello

hello

********深拷貝********

1894005658264

1894005658264

hello

hello

import copy

# 可變物件

a = [1, 2, 3]

print("********賦值********")

b = a

print(id(a))

print(id(b))

print(a)

print(b)

print("********淺拷貝********")

b = copy.copy(a)

print(id(a))

print(id(b))

print(a)

print(b)

print("********深拷貝********")

b = copy.deepcopy(a)

print(id(a))

print(id(b))

print(a)

print(b)

結果:********賦值********

1602694308360

1602694308360

[1, 2, 3]

[1, 2, 3]

********淺拷貝********

1602694308360

1602694308424

[1, 2, 3]

[1, 2, 3]

********深拷貝********

1602694308360

1602950316296

[1, 2, 3]

[1, 2, 3]

import copy

# 可變物件

a = [1, 2, 3, [11, 10, 20]]

# 可變物件的外層修改dzsjlc

b1 = a # 賦值

b2 = copy.copy(a) # 淺拷貝

b3 = copy.deepcopy(a) # 深拷貝

a.append(4)

print("********賦值********")

print(id(a))

print(id(b1))

print(a)

print(b1)

print("********淺拷貝********")

print(id(a))

print(id(b2))

print(a)

print(b2)

print("********深拷貝********")

print(id(a))

print(id(b3))

print(a)

print(b3)

結果:********賦值********

2215309238856

2215309238856

[1, 2, 3, [11, 10, 20], 4]

[1, 2, 3, [11, 10, 20], 4]

********淺拷貝********

2215309238856

2215593496776

[1, 2, 3, [11, 10, 20], 4]

[1, 2, 3, [11, 10, 20]]

********深拷貝********

2215309238856

2215593518024

[1, 2, 3, [11, 10, 20], 4]

[1, 2, 3, [11, 10, 20]]

import copy

# 可變物件

a = [1, 2, 3, [11, 10, 20]]

# 可變物件的內層修改

b1 = a # 賦值

b2 = copy.copy(a) # 淺拷貝

b3 = copy.deepcopy(a) # 深拷貝

a[3].append(4)

print("********賦值********")

print(id(a))

print(id(b1))

print(a)

print(b1)

print("********淺拷貝********")

print(id(a))

print(id(b2))

print(a)

print(b2)

print("********深拷貝********")

print(id(a))

print(id(b3))

print(a)

print(b3)

結果********賦值********

2288591069768

2288591069768

[1, 2, 3, [11, 10, 20, 4]]

[1, 2, 3, [11, 10, 20, 4]]

********淺拷貝********

2288591069768

2288847138760

[1, 2, 3, [11, 10, 20, 4]]

[1, 2, 3, [11, 10, 20, 4]]

********深拷貝********

2288591069768

2288847168264

[1, 2, 3, [11, 10, 20, 4]]

[1, 2, 3, [11, 10, 20]]

Python 賦值 淺拷貝 深拷貝

賦值 a b,只拷貝了物件的引用,沒有拷貝內容。兩個物件的id一樣 淺拷貝 copy.copy 構造乙個新的復合物件,然後將子物件引用插入到原始物件的副本中。深拷貝 copy.deepcopy 構造乙個新的復合物件,然後遞迴地將子物件副本插入原始物件的副本。給個栗子 從這個栗子可以看出,對c進行修改...

python賦值 淺拷貝 深拷貝

視覺化 首先了解知識點 可變 list,dict 和不可變 string,int,tuple 淺拷貝 對於string int來說沒有意義,因為它們資料就一層,對於tuple由於是不可變型別所以新的物件會指向原來的物件位址,對於list和dict,新的物件會在記憶體中開闢乙個新的記憶體空間,並且只拷...

淺拷貝 深拷貝和淺賦值 深賦值

include includeusing namespace std class string else 淺拷貝 也就是系統預設的拷貝,可寫可不寫。string const string s 預設的拷貝構造 深拷貝 string const string s string s2 s1 深賦值 str...