第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

請(qǐng)問(wèn)Python列表混亂怎么辦

請(qǐng)問(wèn)Python列表混亂怎么辦

慕桂英546537 2020-01-06 10:04:55
假設(shè)我有以下代碼:a_list = [[0]*10]*10這將生成以下列表:[[0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]]然后,我要修改第一個(gè)列表中的第一個(gè)元素:a_list[0][0] = 23我希望只修改列表的第一個(gè)元素,但是實(shí)際上每個(gè)列表的第一個(gè)元素都被更改了:[[23, 0, 0, 0, 0, 0, 0, 0, 0, 0], [23, 0, 0, 0, 0, 0, 0, 0, 0, 0], [23, 0, 0, 0, 0, 0, 0, 0, 0, 0], [23, 0, 0, 0, 0, 0, 0, 0, 0, 0], [23, 0, 0, 0, 0, 0, 0, 0, 0, 0], [23, 0, 0, 0, 0, 0, 0, 0, 0, 0], [23, 0, 0, 0, 0, 0, 0, 0, 0, 0], [23, 0, 0, 0, 0, 0, 0, 0, 0, 0], [23, 0, 0, 0, 0, 0, 0, 0, 0, 0], [23, 0, 0, 0, 0, 0, 0, 0, 0, 0]]我設(shè)法找到另一種表示數(shù)據(jù)的方式來(lái)避免這種情況,但是為什么會(huì)這樣呢?為什么不只更改第一個(gè)列表?當(dāng)我執(zhí)行第二個(gè)命令時(shí)*10,Python是否真的復(fù)制了第一個(gè)列表的地址,而不是分配了一個(gè)新的內(nèi)存塊?
查看完整描述

3 回答

?
慕村9548890

TA貢獻(xiàn)1884條經(jīng)驗(yàn) 獲得超4個(gè)贊

您對(duì)復(fù)制地址的直覺(jué)是正確的。像這樣思考:


sub_list = [0] * 10

a_list = [sub_list] * 10

該代碼實(shí)際上與您上面發(fā)布的代碼等效。這意味著您實(shí)際上sub_list在更改的任何元素時(shí)都在更改同一列表a_list。您甚至可以通過(guò)輸入以下內(nèi)容來(lái)確保:


a_list = [[0] * 10] * 10

for n in a_list:

    print id(n)

并且每個(gè)元素都會(huì)顯示相同的內(nèi)容。為了解決這個(gè)問(wèn)題,您應(yīng)該使用:


a_list = [[0] * 10 for _ in range(10)]

為了為的每個(gè)元素創(chuàng)建一個(gè)新的子列表a_list。



查看完整回答
反對(duì) 回復(fù) 2020-01-07
?
MMTTMM

TA貢獻(xiàn)1869條經(jīng)驗(yàn) 獲得超4個(gè)贊

列表包含對(duì)對(duì)象的引用。列表上的乘法僅重復(fù)引用(對(duì)相同對(duì)象?。?。盡管這對(duì)于不可變的對(duì)象(例如整數(shù))來(lái)說(shuō)很好,但是您得到的是對(duì)同一list的多個(gè)引用。

使用此模式創(chuàng)建單獨(dú)的列表[[0]*10 for _ in xrange(10)]。


查看完整回答
反對(duì) 回復(fù) 2020-01-07
?
jeck貓

TA貢獻(xiàn)1909條經(jīng)驗(yàn) 獲得超7個(gè)贊

為什么不只更改第一個(gè)列表?


原因很簡(jiǎn)單,實(shí)際上只有1個(gè)列表,而不是10個(gè)-正如您已經(jīng)懷疑的那樣:


In [1]: [[0]*10]*10

Out[1]:

[[0, 0, 0, 0, 0, 0, 0, 0, 0, 0],

 [0, 0, 0, 0, 0, 0, 0, 0, 0, 0],

 [0, 0, 0, 0, 0, 0, 0, 0, 0, 0],

 [0, 0, 0, 0, 0, 0, 0, 0, 0, 0],

 [0, 0, 0, 0, 0, 0, 0, 0, 0, 0],

 [0, 0, 0, 0, 0, 0, 0, 0, 0, 0],

 [0, 0, 0, 0, 0, 0, 0, 0, 0, 0],

 [0, 0, 0, 0, 0, 0, 0, 0, 0, 0],

 [0, 0, 0, 0, 0, 0, 0, 0, 0, 0],

 [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]]


In [2]: map(id, _)

Out[2]:

[54094624,

 54094624,

 54094624,

 54094624,

 54094624,

 54094624,

 54094624,

 54094624,

 54094624,

 54094624]

如果要?jiǎng)?chuàng)建10個(gè)列表,可以通過(guò)類(lèi)似以下的表達(dá)式輕松實(shí)現(xiàn)


[[0]*10 for x in xrange(10)]



查看完整回答
反對(duì) 回復(fù) 2020-01-07
  • 3 回答
  • 0 關(guān)注
  • 558 瀏覽
慕課專(zhuān)欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢(xún)優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)