为了账号安全,请及时绑定邮箱和手机立即绑定

一开始理解成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下载
官方微信