
熱愛(ài)技術(shù)的小牛
測(cè)試開(kāi)發(fā)通關(guān)秘籍三: 徹底搞懂,賦值,淺拷貝和深拷貝
在Python中,賦值、淺拷貝和深拷貝都是將一個(gè)對(duì)象內(nèi)容復(fù)制到另一個(gè)變量的方式,但它們?cè)趦?nèi)存管理和對(duì)象的獨(dú)立性上有重要區(qū)別。讓我們分別詳細(xì)說(shuō)明并通過(guò)代碼示例來(lái)展示每種方法的效果。
1. 賦值(Assignment)
賦值操作只是將變量名指向同一個(gè)對(duì)象。也就是說(shuō),賦值后的變量和原始變量指向同一個(gè)內(nèi)存地址,修改其中一個(gè)會(huì)影響另一個(gè)。
示例代碼:
# 原始列表
list_a = [1, 2, [3, 4]]
# 賦值操作
list_b = list_a
print("Before modification:")
print("list_a:", list_a)
print("list_b:", list_b)
# 修改 list_b
list_b[0] = 100
list_b[2][0] = 300
print("\nAfter modification:")
print("list_a:", list_a)
print("list_b:", list_b)
輸出:
Before modification:
list_a: [1, 2, [3, 4]]
list_b: [1, 2, [3, 4]]
After modification:
list_a: [100, 2, [300, 4]]
list_b: [100, 2, [300, 4]]
解釋:
-
list_b = list_a并沒(méi)有創(chuàng)建新對(duì)象,而是將list_b指向與list_a相同的內(nèi)存地址。 - 修改
list_b的內(nèi)容后,list_a的內(nèi)容也被修改了,因?yàn)樗鼈児蚕硗粋€(gè)對(duì)象。
2. 淺拷貝(Shallow Copy)
淺拷貝會(huì)創(chuàng)建一個(gè)新的對(duì)象,但只復(fù)制原對(duì)象的“第一層內(nèi)容”,即對(duì)象的頂層結(jié)構(gòu)。這意味著如果對(duì)象內(nèi)部有嵌套對(duì)象,嵌套對(duì)象的引用會(huì)被復(fù)制,而不是內(nèi)容本身。因此,修改嵌套對(duì)象的內(nèi)容會(huì)影響原始對(duì)象。
示例代碼:
import copy
# 原始列表
list_a = [1, 2, [3, 4]]
# 淺拷貝操作
list_b = copy.copy(list_a)
print("Before modification:")
print("list_a:", list_a)
print("list_b:", list_b)
# 修改 list_b
list_b[0] = 100 # 修改第一層元素,不影響 list_a
list_b[2][0] = 300 # 修改嵌套列表,影響 list_a
print("\nAfter modification:")
print("list_a:", list_a)
print("list_b:", list_b)
輸出:
Before modification:
list_a: [1, 2, [3, 4]]
list_b: [1, 2, [3, 4]]
After modification:
list_a: [1, 2, [300, 4]]
list_b: [100, 2, [300, 4]]
解釋:
-
list_b = copy.copy(list_a)創(chuàng)建了一個(gè)新的列表對(duì)象list_b,并復(fù)制了list_a的第一層內(nèi)容。 - 當(dāng)修改
list_b[0]時(shí),不會(huì)影響list_a,因?yàn)?list_b的頂層內(nèi)容獨(dú)立。 - 但是,
list_b[2][0]修改了嵌套的列表內(nèi)容,影響了list_a,因?yàn)榍短琢斜砣匀皇枪蚕淼摹?/li>
3. 深拷貝(Deep Copy)
深拷貝會(huì)創(chuàng)建一個(gè)新的對(duì)象,并遞歸復(fù)制原對(duì)象的所有內(nèi)容,包括所有嵌套對(duì)象。這樣,新的對(duì)象和原對(duì)象完全獨(dú)立,修改任何一方都不會(huì)影響另一方。
示例代碼:
import copy
# 原始列表
list_a = [1, 2, [3, 4]]
# 深拷貝操作
list_b = copy.deepcopy(list_a)
print("Before modification:")
print("list_a:", list_a)
print("list_b:", list_b)
# 修改 list_b
list_b[0] = 100 # 修改第一層元素,不影響 list_a
list_b[2][0] = 300 # 修改嵌套列表,不影響 list_a
print("\nAfter modification:")
print("list_a:", list_a)
print("list_b:", list_b)
輸出:
Before modification:
list_a: [1, 2, [3, 4]]
list_b: [1, 2, [3, 4]]
After modification:
list_a: [1, 2, [3, 4]]
list_b: [100, 2, [300, 4]]
解釋:
-
list_b = copy.deepcopy(list_a)創(chuàng)建了一個(gè)完全獨(dú)立的深拷貝對(duì)象。 - 無(wú)論修改
list_b的第一層元素還是嵌套列表,都不會(huì)影響list_a,因?yàn)?list_b包含了list_a的所有內(nèi)容副本。
總結(jié)
- 賦值:共享同一個(gè)對(duì)象,所有層次的修改都會(huì)相互影響。
- 淺拷貝:創(chuàng)建一個(gè)新對(duì)象,只復(fù)制頂層內(nèi)容,嵌套對(duì)象仍然是引用。
- 深拷貝:創(chuàng)建一個(gè)新對(duì)象,遞歸復(fù)制所有層次內(nèi)容,原對(duì)象和新對(duì)象完全獨(dú)立。

熱愛(ài)技術(shù)的小牛