[英]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.