python賦值與深淺拷貝

2021-10-05 10:16:35 字數 2614 閱讀 7450

參考文章

在python中,物件的賦值就是簡單的物件引用,這點和c++不同。如下:

a =[1

,2,3

,"hello",[

"python"

,"c++"]]

b = a

for i in

range

(len

(a))

:print(id

(a[i])==

id(b[i]))

# all true

print

(a == b)

# true

這種情況下,b和a是一樣的,他們指向同一片記憶體,b不過是a的別名,是引用。我們可以使用a與b是否相同來判斷,返回true,表明他們位址相同,內容相同。

賦值操作(包括物件作為引數、返回值)不會開闢新的記憶體空間,它只是複製了新物件的引用。也就是說,除了b這個名字以外,沒有其它的記憶體開銷。

修改了a,就影響了b;同理,修改了b就影響了a。

a =[1

,2,3

,"hello",[

"python"

,"c++"]]

b = a

"add"

)print

("a="

,a,"b="

,b)#a=[1, 2, 3, 'hello', ['python', 'c++'], 'add'] b=[1, 2, 3, 'hello', ['python', 'c++'], 'add']

淺拷貝會建立新物件,其內容是原物件的引用。

淺拷貝有三種形式:切片操作,工廠函式,copy模組中的copy函式。

比如對上述a:

1、切片操作:b = a[:] 或者 b = [each for each in a]

2、工廠函式:b = list(a)

3、copy函式:b = copy.copy(a)

淺拷貝產生的b不再是a了,使用is可以發現他們不是同乙個物件,使用id檢視,發現它們也不指向同一片記憶體。但是當我們使用 id(x) for x in a 和 id(x) for x in b 時,可以看到二者包含的元素的位址是相同的。

a =[1

,2,3

,"hello",[

"python"

,"c++"]]

b = a[:]

print(id

(a)==

id(b)

)# false

for i in

range

(len

(a))

:print(id

(a[i])==

id(b[i]))

# all true

"add"

)print

("a"

, a,

"b", b)

# a [1, 2, 3, 'hello', ['python', 'c++']] b [1, 2, 3, 'hello', ['python', 'c++'], 'add']

但是要注意,淺拷貝之所以稱為淺拷貝,是它僅僅只拷貝了一層,在a中有乙個巢狀的list,如果我們修改了它,情況就不一樣了。

深拷貝只有一種形式,copy模組中的deepcopy函式。

和淺拷貝對應,深拷貝拷貝了物件的所有元素,包括多層巢狀的元素。因而,它的時間和空間開銷要高。

同樣對la,若使用b = copy.deepcopy(a),再修改b將不會影響到a了。即使巢狀的列表具有更深的層次,也不會產生任何影響,因為深拷貝出來的物件根本就是乙個全新的物件,不再與原來的物件有任何關聯。

import copy

a =[1,

2,3,

"hello",[

"python"

,"c++"]]

b = copy.deepcopy(a)

print(id

(a)==

id(b)

)# false

for i in

range

(len

(a))

:print(id

(a[i])==

id(b[i]))

# true true true true false

print(id

(a[-1]

[0])

==id

(b[-1]

[0])

)# true

print(id

(a[-1]

[1])

==id

(b[-1]

[1])

)# true

"add"

)print

("a="

, a,

"b="

, b)

# a [1, 2, 3, 'hello', ['python', 'c++']] b [1, 2, 3, 'hello', ['python', 'c++'], 'add']

1、對於非容器型別,如數字,字元,以及其它「原子」型別,沒有拷貝一說。產生的都是原物件的引用。

2、如果元組變數值包含原子型別物件,即使採用了深拷貝,也只能得到淺拷貝。

Python賦值與深淺拷貝

a 1,2,3 b a a 4,5,6 賦新的值給 a a 4,5,6 b 1,2,3 a 的值改變後,b 並沒有隨著 a 變 a 1,2,3 b a a 0 a 1 a 2 4,5,6 改變原來 list 中的元素 a 4,5,6 b 4,5,6 a 的值改變後,b 隨著 a 變了 上面兩段 中,...

賦值與深淺拷貝

a 1 b a a 2 print a a print b b 列印出結果 a 2 b 1 解析 當a 1的時候,記憶體中開闢兩個空間,乙個空間存放數字1,乙個空間存放數字1的實體地址0x52446c40,當b a的時候,是將a的值賦予b,記憶體中會開闢另乙個空間也是存放數字1的實體地址0x5244...

python中的深淺拷貝與賦值。

賦值 賦值就是乙個變數引用乙個變數的值。這兩個變數共用乙個記憶體位址。當使用可變資料結構時 如 list,dict,set 其中乙個變數的值改變,會使另乙個變數的值也發生改變,但記憶體位址不改變。a 1 2,3 b ab 1 4print id a a,id b b 1992269718152 1,...