0.名詞解釋
1.對象:被分配的一塊內存,存儲其所代表的值
2.引用:是自動形成的從變量到對象的指針
3.注意:類型(int類型,long類型(python3已去除long類型,只剩下int類型的數據))屬于對象,不是變量
4.不可變對象:一旦創建就不可修改的對象,包括字符串、元組、數字
5.可變對象:可以修改的對象,包括列表、字典。
1.賦值
- python中的賦值是對象的引用,python并沒有拷貝這個對象,只是指向了被引用對象的內存地址。
a = [1,2,3]
b = a
print(id(a))
81960592
print(id(b))
81960592
- a與b指向的是同一個內存地址,改變a中的值,b同樣會改變。
a = [1,2,3]
b = a
a[0] = 5
print(a)
[5,2,3]
print(b)
[5,2,3]
2.淺拷貝
-
淺拷貝只會拷貝當前對象,并給予一個新內存地址,不會當前對象內的元素進行拷貝,而是直接引用當前對象的元素所指向的內存地址。
1.第一種情況 當數據為不可變對象時:此時進行淺拷貝,拷貝得到的對象內的子元素與原對象指向不同的內存地址。
a = [3,2,5] b = a.copy() a[0] = 6 print(b) [3,2,5] print(a) [6,2,5]
2.第二種情況 當數據為可變對象時,淺拷貝得到的新對象內的可變對象為原對象內可變對象的引用。
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.深拷貝
- 深拷貝是將原對象完全拷貝,新對象及其子元素均給予新的內存地址,與原對象完全無關。
b = [1,2,[2,3]]
a = copy.deepcopy(b)
b[2][0] = 4
print(a)
[1, 2, [2, 3]]
4.特殊情況
當一個對象及其子元素全為不可變對象時,無論是深拷貝還是淺拷貝,拷貝后的對象均指向原對象的地址,即為原對象的引用。
a = (1,2,3)
b = copy.copy(a)
c = copy.deepcopy(a)
print(id(a)) #17865462
print(id(b)) #17865462
print(id(c)) #17865462