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