日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

python 实例对象 浅拷贝_Python3 入门教程——浅拷贝深拷贝差别

發(fā)布時間:2025/5/22 57 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python 实例对象 浅拷贝_Python3 入门教程——浅拷贝深拷贝差别 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

前言

在 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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。