簡體   English   中英

在Python中使用for循環在列表上使用remove()和append()

[英]Using remove() and append() on a list using a for loop in Python

當我運行以下代碼並打印“ array”和“ main”時,得到的答案與“ main”和“ array”相同。 我僅修改“ main”,但是為什么它也會影響“ array”。 有人可以幫忙嗎?

array = ["a",0,0,"b","c","d",0,1,0,1,0,3,0,1,9,0,0,0,0,9]
main = array



for i in range(0,len(main)-1):
   if main[i] == 0 or main[i] == 0.0:
       main.pop(i)
       main.append(0)


print main
print array

在python中,變量是對內存中實例的引用。 當您這樣做時:

main = array

您要向main分配對同一實例的引用,您可以使用以下命令進行檢查:

print(id(main))
print(id(array))

當您更改要迭代的列表時,就打開了可怕和可怕問題的大門。

如評論中所述,您的解決方案是復制列表:

main = array[:]

這是較短的等效項:

main = []
for elt in array:
    main.append(array)

表示列表中的實例在兩個列表中都相同,但是容器不同。

但是,因為該解決方案意味着您要遍歷列表兩次(一次創建副本,然后第二次更改值),所以更好的方法是實際遍歷一個列表,然后在創建時創建第二個列表:

main = []
for item in array:
   if item in (0, 0.0):
       main.append(0)
   else:
       main.append(item)

Nota Bene:在您的代碼段中,您正在使用以下方式遍歷列表:

for i in range(0,len(main)-1):
    # use main[i]

那根本不是pythonic,相反,您只需要使用以下更具可讀性的語法即可:

for item in main:
    # use item

變量和數組(在python中稱為“列表”)的工作方式不同。 您僅以這種方式創建“別名”。 發生這種情況是因為兩個名稱(“ main”和“ array”)將指向相同的內存地址。

為避免出現不同的選擇:

1)以這種方式使用copy()函數:

main = array.copy()

2)或:

import copy
main = copy.copy(array)

3)使用“列表”內置方法:

main = list(array)

4)創建一個新的Empy列表並擴展它:

main = []
main.extend(array)

5)使用切片:

main = array[:]

6)如果要創建多維列表,則上面的示例還不夠。 在這種情況下,您需要使用deepcopy()函數:

import copy
main = copy.deepcopy(array)

請勿在迭代時修改列表。 生成一個新列表:

array = ["a",0,0,"b","c","d",0,1,0,1,0,3,0,1,9,0,0,0,0,9]
main = [x for x in array if x != 0]
main.extend([0] * (len(main)-len(array)))

print main
print array

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM