一、 問題
在寫代碼的時候,發現對一列表的循環始終不能完全,寫法如下:
test_list = ['3','4','5','6','4',3','5','5','5','5']
parentLst = test_list
for eachEtm in parentLst :
if eachEtm == '5':
test_list.remove(eachEtm)
if len(test_list) != len(list(set(test_list))):
.................................
用來實現輸入的數值,除元素‘5’外,其餘的數值不能重複,否則報錯。
但是上述代碼,經過循環刪除後,test_list列表是
['3','4','6','4',3','5','5']
添加打印後,發現eachEtm元素沒有‘6’這項的循環,隨後打印列表
test_list = ['3','4','5','6','4',3','5','5','5','5']
parentLst = test_list
for eachEtm in parentLst :
if eachEtm == '5':
test_list.remove(eachEtm)
log("parentLst : %s", %parentLst )
log("test_list : %s", %test_list)
if len(test_list) != len(list(set(test_list))):
.................................
此時,添加打印,每輪的parentLst 和test_list 列表元素相同,即for循環檢索的列表始終處於變化狀態,parentLst 和test_list並非兩塊獨立內存存儲。
二、 修改
把
parentLst = test_list
修改爲
parentLst = list(test_list)
即可。
三 、原因
parentLst = test_list
這種賦值方式,相當於此列表的一個引用,並沒有複製test_list指向的列表;list()是列表構造函數,它會在傳入的數列基礎上新建列表。