3 回答

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。

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)]
。

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)]
添加回答
舉報(bào)