真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

Python 可變對(duì)象的賦值

在使用 Python 列表時(shí), 出現(xiàn)了修改其中一個(gè)列表, 其他列表聯(lián)動(dòng)改變這個(gè)情況, 在查閱文檔后, 寫在這里記錄一下.

我們提供的服務(wù)有:網(wǎng)站建設(shè)、網(wǎng)站設(shè)計(jì)、微信公眾號(hào)開發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認(rèn)證、梧州ssl等。為上千企事業(yè)單位解決了網(wǎng)站和推廣的問題。提供周到的售前咨詢和貼心的售后服務(wù),是有科學(xué)管理、有技術(shù)的梧州網(wǎng)站制作公司

出現(xiàn)這個(gè)情況的原因是因?yàn)槲沂褂昧?a = b 這個(gè)賦值語句, 我下意識(shí)的認(rèn)為 a, b 是兩個(gè)不同的對(duì)象, 其實(shí)在 Python 一切都是對(duì)象, 所謂的變量, 只是指向一個(gè)對(duì)象的內(nèi)存地址. 我們平時(shí)使用的賦值語句 = 其實(shí)只是讓一個(gè)一個(gè)變量指向另一個(gè)變量指向的內(nèi)存地址. 例如:

a = 1
b = a
print(a, b)
print(id(a))
print(id(b))
a = 2
print(a, b)

1 1


2 1

可以看到兩個(gè)變量指向同一個(gè)內(nèi)存地址, 這是 Python 解釋器為了節(jié)省內(nèi)存資源, 選擇的一種方式. 可以看到, 當(dāng)變量指向不可變類型時(shí)候, b 的值并不會(huì)隨著 a 的變化而變化.

然而這種方式有一個(gè)弊端, 當(dāng)我們面對(duì)可變類型時(shí), 就會(huì)發(fā)生一些不可控的事情.

a = [1, 2, 3]
b = a
print(a, b)
print(id(a))
print(id(b))
a[0] = 4
print(a, b)

[1, 2, 3] [1, 2, 3]


[4, 2, 3] [4, 2, 3]

可以看到, 因?yàn)?a, b 兩個(gè)變量指向的是同一個(gè)內(nèi)存地址, 當(dāng)我們修改 a 的數(shù)據(jù)時(shí), b會(huì)一起改變. 常規(guī)情況下,這并不是我們想要的結(jié)果.

那么, 有沒有辦法把數(shù)據(jù)拷貝到一塊新的內(nèi)存地址中呢?

淺拷貝與深拷貝

這就需要用到 Python 內(nèi)置庫 copy. 我們需要用到這個(gè)庫中的 copy, deepcopy 兩個(gè)方法.

淺拷貝

我們使用 b = copy.copy(a) 進(jìn)行淺拷貝, 執(zhí)行這個(gè)語句后 a, b 是兩個(gè)不同的對(duì)象, 指向不同的內(nèi)存地址.

但是 a, b 中的子對(duì)象還是會(huì)指向同一地址, 例如下文中的 a 列表中的字典, b 列表中的字典就是子對(duì)象, 他們其實(shí)指向的是同一內(nèi)存地址.

import copy


a = [1, 2, 3, {'a': 1, 'b': 2, 'c': 3}]
b = copy.copy(a)
print(a)
print(b)
print(id(b))
print(id(a))
a[0] = 2
print(a)
print(b)

[1, 2, 3, {'a': 1, 'b': 2, 'c': 3}]
[1, 2, 3, {'a': 1, 'b': 2, 'c': 3}]


[2, 2, 3, {'a': 1, 'b': 2, 'c': 3}]
[1, 2, 3, {'a': 1, 'b': 2, 'c': 3}]

可以看到, a, b 指向了不同的地址. 我們看下 a, b 中的子對(duì)象指向的內(nèi)存地址

import copy


a = [1, 2, 3, {'a': 1, 'b': 2, 'c': 3}]
b = copy.copy(a)
print(id(a[3]))
print(id(b[3]))



可以看到, a, b 的子對(duì)象指向的內(nèi)存. 因此, 當(dāng)我們對(duì)這個(gè)字典進(jìn)行操作時(shí), 另一個(gè)數(shù)組對(duì)象中的也會(huì)隨之變化, 原理同上.

那么, 有沒有什么可以規(guī)避這一現(xiàn)象呢? 接下來我們走進(jìn)深拷貝.

深拷貝

我們使用 b = copy.deepcopy(a) 進(jìn)行深拷貝, 執(zhí)行這個(gè)語句后 a, b 是兩個(gè)不同的對(duì)象, 指向不同的內(nèi)存地址. 且 a, b 的子對(duì)象也指向不同的內(nèi)存地址, a, b 指向除了值相等, 完全沒有任何關(guān)系的對(duì)象.

import copy


a = [1, 2, 3, {'a': 1, 'b': 2, 'c': 3, 'f': [1, 2, 3]}]
b = copy.deepcopy(a)
print(a)
print(b)
print(id(b))
print(id(a))
print(id(a[3]))
print(id(b[3]))
print(id(a[3]["f"]))
print(id(b[3]["f"]))
a[1] = 0
a[3]['d'] = 4
print(a)
print(b)

[1, 2, 3, {'a': 1, 'b': 2, 'c': 3, 'f': [1, 2, 3]}]
[1, 2, 3, {'a': 1, 'b': 2, 'c': 3, 'f': [1, 2, 3]}]






[1, 0, 3, {'a': 1, 'b': 2, 'c': 3, 'f': [1, 2, 3], 'd': 4}]
[1, 2, 3, {'a': 1, 'b': 2, 'c': 3, 'f': [1, 2, 3]}]

可以看到, 不論對(duì)象嵌套有多少個(gè)子對(duì)象, 進(jìn)行深拷貝后得到的對(duì)象及其子對(duì)象, 都指向不同的地址. 同樣的, 對(duì)其中任何數(shù)據(jù)的修改都不會(huì)影響到另一個(gè)對(duì)象.

可以看到, Python 為了適應(yīng)不同的需求, 為我們提供了非常靈活的方法, 可以根據(jù)需求靈活使用.


分享標(biāo)題:Python 可變對(duì)象的賦值
分享網(wǎng)址:http://weahome.cn/article/dsoghpj.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部