
5-9的這個問題我的想法是在每洗掉一個元素的同時可以列印出這個元素,在最后串列為空時列印“We need to find some users!"
user_name = ["a","b","c","d","e"]
if user_name:
for name in user_name:
poped_name = user_name.pop()
print(poped_name)
if user_name:
print("?")
else:
print("We need to find users!")
print(user_name)

上面的輸出只彈出了三個?我預想是要全部洗掉的啊,為什么是三個?
我發現遍歷串列好像是從前往后的,pop()方法默認是從后往前的,這里有問題?
所以我換成remove()方法再試了一下

似乎remove()方法不能列印洗掉的元素了,巧合是也洗掉了三個元素,離譜的是留下的是b和d?

我的問題:
1.上面的程序哪里(我感覺好多地方)錯了?為什么?
2.怎樣寫這段代碼?有簡潔的方法嗎?
以上
求教 謝謝!
uj5u.com熱心網友回復:
這是因為for回圈伊始list有5個元素,在回圈程序中list改變了長度。你可以用list.copy()就不會有問題了。這里list就是user_name參考代碼:
if user_name:
for name in user_name.copy():
poped_name = user_name.pop()
print(poped_name)
if user_name:
print("?")
else:
print("We need to find users!")
print(user_name)
list.pop方法,是傳入index,從串列中移除此元素,并回傳此元素的值。不傳入index就移除最后一個元素。
L.pop([index]) -> item -- remove and return item at index (default last).
list.remove方法,是傳入元素值,從串列中移除第一個此元素值的元素,并回傳None
L.remove(value) -> None -- remove first occurrence of value.
uj5u.com熱心網友回復:
為什么遍歷串列時要對串列回傳一個淺復制?我先說說我的想法
淺復制是只復制了不可變物件,而沒有復制可變物件,物件里的可變元素作為深層次的資料結構并沒有被拷貝到新地址里面去,而是和原物件里的可變元素指向同一個地址。這里的可變物件是串列user_name,不可變物件是串列里面的每個字串
在遍歷淺復制的串列后,回圈里的內容只對不可變物件進行洗掉,而由于不可變物件的地址并沒有修改,所以原來的user_name里面的元素也同樣被洗掉了
而"回圈里的內容只對不可變物件進行洗掉"這句話是我猜測的,所以我想看看回圈里面的user_name的地址是不是改變了?
于是測驗下?

看來并沒有改變
回圈里面修改的大概是原來的user_name串列 。
這么說的話就是回圈里面的pop()方法每對原串列彈出一個元素,由于淺復制的串列不可變元素的地址是相同的,所以每次遍歷串列的時候,淺復制串列里面也彈出了一個不可變元素(str)?
那么這樣的話那么原來的代碼為什么還是會彈出三個呢?到底是執行了怎樣的操作呢?
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/28315.html
