總結(jié)
本文介紹了對象的賦值和拷貝,以及它們之間的差異:
- Python中對象的賦值都是進行對象引用(內(nèi)存地址)傳遞
- 使用copy.copy(),可以進行對象的淺拷貝,它復制了對象,但對于對象中的元素,依然使用原始的引用.
- 如果需要復制一個容器對象,以及它里面的所有元素(包含元素的子元素),可以使用copy.deepcopy()進行深拷貝
- 對于非容器類型(如數(shù)字、字符串、和其他’原子’類型的對象)沒有被拷貝一說
- 如果元祖變量只包含原子類型對象,則不能深拷貝,看下面的例子
1:對象的賦值
Python中,對象的賦值都是進行對象引用(內(nèi)存地址)傳遞
will = ["Will", 28, ["Python", "C#", "JavaScript"]] wilber = will由于will和wilber指向同一個對象,所以對will的任何修改都會體現(xiàn)在wilber上
2:淺拷貝
import copy will = ["Will", 28, ["Python", "C#", "JavaScript"]] wilber = copy.copy(will)
淺拷貝會創(chuàng)建一個新的對象,這個例子中”wilber is not will”
但是,對于對象中的元素,淺拷貝就只會使用原始元素的引用(內(nèi)存地址),也就是說”wilber[i] is will[i]”
當我們使用下面的操作的時候,會產(chǎn)生淺拷貝的效果:
使用切片[:]操作
使用工廠函數(shù)(如list/dir/set)
使用copy模塊中的copy()函數(shù)
3:深拷貝
跟淺拷貝類似,深拷貝也會創(chuàng)建一個新的對象,這個例子中”wilber is not will”
但是,對于對象中的元素,深拷貝都會重新生成一份(有特殊情況,下面會說明),而不是簡單的使用原始元素的引用(內(nèi)存地址)
import copy will = ["Will", 28, ["Python", "C#", "JavaScript"]] wilber = copy.deepcopy(will)