0.名詞解釋
1.對象:被分配的一塊內(nèi)存售睹,存儲(chǔ)其所代表的值
2.引用:是自動(dòng)形成的從變量到對象的指針
3.注意:類型(int類型,long類型(python3已去除long類型,只剩下int類型的數(shù)據(jù)))屬于對象龙誊,不是變量
4.不可變對象:一旦創(chuàng)建就不可修改的對象韭寸,包括字符串春哨、元組、數(shù)字
5.可變對象:可以修改的對象恩伺,包括列表赴背、字典。
1.賦值
- python中的賦值是對象的引用,python并沒有拷貝這個(gè)對象凰荚,只是指向了被引用對象的內(nèi)存地址燃观。
a = [1,2,3]
b = a
print(id(a))
81960592
print(id(b))
81960592
- a與b指向的是同一個(gè)內(nèi)存地址,改變a中的值,b同樣會(huì)改變便瑟。
a = [1,2,3]
b = a
a[0] = 5
print(a)
[5,2,3]
print(b)
[5,2,3]
2.淺拷貝
-
淺拷貝只會(huì)拷貝當(dāng)前對象缆毁,并給予一個(gè)新內(nèi)存地址,不會(huì)當(dāng)前對象內(nèi)的元素進(jìn)行拷貝到涂,而是直接引用當(dāng)前對象的元素所指向的內(nèi)存地址脊框。
1.第一種情況 當(dāng)數(shù)據(jù)為不可變對象時(shí):此時(shí)進(jìn)行淺拷貝,拷貝得到的對象內(nèi)的子元素與原對象指向不同的內(nèi)存地址践啄。
a = [3,2,5] b = a.copy() a[0] = 6 print(b) [3,2,5] print(a) [6,2,5]
2.第二種情況 當(dāng)數(shù)據(jù)為可變對象時(shí)浇雹,淺拷貝得到的新對象內(nèi)的可變對象為原對象內(nèi)可變對象的引用。
a = [3,2,[1,2]] b = a.copy() a[2][0] = 4 print(b) [3,2,[4,2]] print(a) [3,2,[4,2]]
3.深拷貝
- 深拷貝是將原對象完全拷貝屿讽,新對象及其子元素均給予新的內(nèi)存地址昭灵,與原對象完全無關(guān)。
b = [1,2,[2,3]]
a = copy.deepcopy(b)
b[2][0] = 4
print(a)
[1, 2, [2, 3]]
4.特殊情況
當(dāng)一個(gè)對象及其子元素全為不可變對象時(shí)伐谈,無論是深拷貝還是淺拷貝,拷貝后的對象均指向原對象的地址烂完,即為原對象的引用。
a = (1,2,3)
b = copy.copy(a)
c = copy.deepcopy(a)
print(id(a)) #17865462
print(id(b)) #17865462
print(id(c)) #17865462