亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定

一開始理解成L和S都有的數字,就從L中刪除,把剩下的數字傳給S,即L→L(2,4,6,8,10, S={1,2,3,4,5,6,7,8,9,10,11},就寫了下面的代碼,為什么用debug調試 ,num的數值只經過1,3,5,7,9,沒有2,4,6,8?

L?=?[1,?2,?3,?4,?5,?6,?7,?8,?9,?10]
S?=?set([1,?3,?5,?7,?9,?11])

for?num?in?L:
????if?num?in?S:
????????L.remove(num)
????else:
????????S.add(num)

print(L)????#?L=[2,?4,?6,?8,?10]
print(S)????#?S?={1,?3,?5,?7,?9,?11}


正在回答

3 回答

那答案中的remove為什么沒有向前移動

0 回復 有任何疑惑可以回復我~

對于python中的remove()函數,官方文檔的解釋是:Remove first occurrence of value.大意也就是移除列表中等于指定值的第一個匹配的元素。
常見用法:?a = [1,2,3,4],a.remove(1),然后a就是[2,3,4];對于a = [1,1,1,2],其結果也是[1,1,2],這是最基本的用法。
但是對于下面這個:

a?=?[1,2,3,4]
for?i?in?a:
??????a.remove(i)#?結果a?=?[2,4]

或者說

a?=?[1,1,1,1,1,2]
for?i?in?a:
??????a.remove(1)#結果a?=?[1,1,2]
是不是跟想象中的不一樣,其主要原因如下(^表示當前迭代器位于列表中的位置):
???a?=?[?1?,?2?,?3?,?4]
假設此時??^
默認情況下只想第一個元素,然后執行a.remove(1),然后下標向后移動,列表因為刪除了元素,后面的向前移動,如下:
???a?=?[?2?,?3?,?4]
???此時???????^
此時執行a.remove(3),重復上面的移動
???a?=?[?2?,?4]
???此時???????????^
因為已經到了列表的邊界,故結束遍歷,并返回`a?=?[2,4]`。


0 回復 有任何疑惑可以回復我~
#1

慕UI7540685 提問者

那答案中的remove為什么沒有向前移動
2020-10-14 回復 有任何疑惑可以回復我~
#2

慕UI7540685 提問者

懂了,多謝
2020-10-14 回復 有任何疑惑可以回復我~

問題說的有點亂,我重新梳理了下: 如果將答案里面的if i in S:S.remove(i),改成 if i in S: L.remove(i),得到如下代碼:

L?=?[1,?2,?3,?4,?5,?6,?7,?8,?9,?10]???????????????????????????
S?=?set([1,?3,?5,?7,?9,?11])
for?i?in?L:
????if?i?in?S:
????????L.remove(i)?
????else:
????????S.add(i)
print(S)????????

通過pycharm的debug發現,這時候的for?i?in?L?里的i=(1,3,5,7,9),而不像答案的i?=(1,2,3,4,5,6,7,8,9,10),求大佬告知為這是為什么




0 回復 有任何疑惑可以回復我~

舉報

0/150
提交
取消

一開始理解成L和S都有的數字,就從L中刪除,把剩下的數字傳給S,即L→L(2,4,6,8,10, S={1,2,3,4,5,6,7,8,9,10,11},就寫了下面的代碼,為什么用debug調試 ,num的數值只經過1,3,5,7,9,沒有2,4,6,8?

我要回答 關注問題
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號