Python基础:对象的深拷贝和浅拷贝的区别
生活随笔
收集整理的這篇文章主要介紹了
Python基础:对象的深拷贝和浅拷贝的区别
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Python基礎:對象的深拷貝和淺拷貝的區別
- 1 變量與對象
- 2 不可變對象與可變對象
- 3 直接賦值
- 4 淺拷貝
- 5 深拷貝
- 參考文獻
1 變量與對象
- 對象:內存中存儲數據的實體,有明確的類型。在Python中,一切都是對象,函數也是對象。
- 變量:指向對象的指針,對對象的引用。作為弱類型語言,Python中變量是沒有類型的。
2 不可變對象與可變對象
- 不可變對象:對象對應內存中的值不會變,因此如果指向該對象的變量被改變了,會重新開辟一片內存,變量指向這個新的內存,包括int、float、str、tuple。
- 可變對象:對象對應內存中的值可以改變,因此變量改變后,該對象也會改變,即原地修改,如list、dict、set等。
對于不可變對象,所有指向該對象的變量在內存中共用一個地址:
a = 1 b = 1 c = a + 0 # 使用id函數查看三個變量的內存地址 flag = id(a) == id(b) and id(a) == id(c) print(id(a)) # 1986179296 print(id(b)) # 1986179296 print(id(c)) # 1986179296 print(flag) # True3 直接賦值
在Python中對象賦值實際上是對象的引用。當創建一個對象,然后把它賦給另一個變量的時候,并沒有拷貝這個對象,而只是拷貝了這個對象的引用。
直接賦值默認淺拷貝,只傳遞對象的引用,原始列表改變,被賦值的b也會做相同的改變
# 直接賦值 # a和b引用相同的list,所以會相互改變 alist = [1, 2, 3, ['a','b']] b = alist alist.append(5) alist[3].append('c') print("List a:", alist) print("List b:", b)4 淺拷貝
淺拷貝沒有拷貝子對象,原始數據改變時,子對象會改變。
# 淺拷貝 import copyalist = [1, 2, 3, ['a', 'b']]# 沒有拷貝子對象,公用一個可變list對象 c = copy.copy(alist)# 非可變子對象,所以不會改變c alist.append(5)# 可變子對象,會改變c alist[3].append('ccc')print("List a:", alist) print("List c:", c)5 深拷貝
深拷貝包含對象里面的對象,所以原始對象的改變不會造成深拷貝對象的改變。
# 深拷貝 import copyalist = [1, 2, 3, ['a', 'b']] # alist和d完全獨立所有對象 d = copy.deepcopy(alist) alist.append(5) alist[3].append('ccc')print("List a:", alist) print("List d:", d)參考文獻
總結
以上是生活随笔為你收集整理的Python基础:对象的深拷贝和浅拷贝的区别的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: for循环和增强for循环
- 下一篇: wandb: 深度学习轻量级可视化工具入