python 实例对象 浅拷贝_Python3 入门教程——浅拷贝深拷贝差别
前言
在 Python 中提供了一個用于拷貝操作的 copy 模塊,該模塊中提供 淺拷貝 和 深拷貝 兩種操作,其中:
淺拷貝:只是將對象管理地址進行打包復制,其內部的元素的并未進行復制,而是使用舊的存儲地址。
深拷貝 :是將對象中的所有元素進行復制,然后重新開辟空間來存儲。
對象和內存
對象和內存中的值是映射的關系,當需要取內存中的值的時候,需要通過其變量名去獲取。
內存中的值是單一的,但其映射的對象可以是多個,所以某一個對象修改其內存的值后,其所有的映射到該內存上的對象都會刷新到最新的值。
實例如下:
>>> a = [1,2,3] # 定義一個變量(對象)
>>>
>>> b = a # 將變量的 a 的值賦給變量 b
>>> id(a) # 查看 a 的存儲內存空間
3070831436L
>>> id(b) # 查看 b 的存儲內存空間
3070831436L
>>>
>>> a.append(4) # 給 a 對象列表,添加一個新的元素 ‘4’
>>> a # 查看 a 的值
[1, 2, 3, 4]
>>> b # 查看 b 的值
[1, 2, 3, 4]
>>>
通過以上可以看到,不同變量之間,相同的值存儲的內存空間是一樣的;當使用 a 變量修改其內容時,b 變量的值也會放生改變。
淺拷貝
特點:淺拷貝只復制變量的整體引用地址,不會復制變量內部元素的地址。當內部元素發生變化時,復制后的值和會隨著賦值對象的變化而變化。
實例如下:
>>> import copy
>>> a = [1,2,['a','b'],3] # 定義嵌套列表
>>> b = copy.copy( a ) # 復制a(淺拷貝)
>>> a
[1, 2, ['a', 'b'], 3]
>>> b
[1, 2, ['a', 'b'], 3]
>>> id(a)
3070610124L # 查看 a 與 b 變量的地址
>>> id(b)
3070631500L
#查看列表 a 與 b 中第 2 個元素的地址:
>>> id(a[1])
163477668
>>> id(b[1])
163477668
#查看列表 a 與 b 中的第 3 個元素(嵌套列表)的地址:
>>> id(a[2])
3070631436L
>>> id(b[2])
3070631436L
#可見它們的地址還是同一個存儲地址
# 接下來是改變 a 的值,然后再查看 b 的值:
>>> a[2].append('c')
>>> a
[1, 2, ['a', 'b', 'c'], 3]
>>> b
[1, 2, ['a', 'b', 'c'], 3]
分析:通過觀察可知 淺拷貝時,當改變元素內部的值時,復制后對象的值,會隨著賦值前對象值的變化而變化。
由于數字類型為不可變類型,所以復制前后的存儲位置是一致的,并不存在同值不同存儲位置的情況。
因為 數字類型 為不可變類型,所以這里不加以比較!
提示:在大列表中 添加/修改 元素,復制后的值不受影響。
深拷貝
特點:深拷貝會將數據全部復制,然后重新開辟新的空間來儲存該值。所以,復制后的值都是相對獨立的,后期使用并不受復制前的對象所影響。
基本語法:
deepcopy(x, memo=None, _nil=[])
參數說明:x 是賦值的對象 、memo 和 _nil 參數可缺省。
實例如下:
>>> import copy
>>> a = [4,5,['a','b'],6]
>>> b = copy.deepcopy(a) # 使用深拷貝復制 a 對象
>>> a
[4, 5, ['a', 'b'], 6]
>>> b
[4, 5, ['a', 'b'], 6]
>>>
#查看列表 a 和 b 中的嵌套列表,可見它們的地址是獨立的:
>>> id(a[2])
3070658220L
>>> id(b[2])
3069923596L
# 修改 a 列表中的嵌套列表,觀察其變化:
>>> a[2].append('c')
>>> a
[4, 5, ['a', 'b', 'c'], 6, 'c']
>>> b
[4, 5, ['a', 'b'], 6]
# 可見修改 a 后 b 也不會發生任何的變化
分析:通過以上可見,采用深拷貝操作后,是將被復制對象的所有值進行拷貝,然后重新開辟新的存儲單元來存儲拷貝后的內容,所以復制后的內容并不受前面被復制對象的改變而改變。
喜歡 (0)or分享 (0)
總結
以上是生活随笔為你收集整理的python 实例对象 浅拷贝_Python3 入门教程——浅拷贝深拷贝差别的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: async python两个_【Pyth
- 下一篇: 怎么看rabbitmq的浏览器信息_没用