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