list.remove() 在嵌套的 for 循环中

list.remove() within nested for loops

我有两个列表,想检查第一个列表中的元素是否在第二个列表中。 如果为真,我想从第一个列表的副本中删除匹配的元素。

my_list = [ 
    '100a',
    '100b',
    '100c'
]
    
your_list = [
    '100a_nnb',
    '100b_ub',
    '100c_AGGtb'
]

my_list_2 = my_list


for i in my_list:
    for j in your_list:
        if i in j:
            print(f'Yes, {i} is in {j}!')
            #my_list_2.remove(i)
            break
        else:
            print(f'No, {i} is not in {j}!')

当我离开 my_list_2.remove(i) 评论时,我得到了预期的结果:

Yes, 100a is in 100a_nnb!
No, 100b is not in 100a_nnb! 
Yes, 100b is in 100b_ub!
No, 100c is not in 100a_nnb!
No, 100c is not in 100b_ub!
Yes, 100c is in 100c_AGGtb!

当我删除 # 它给我:

Yes, 100a is in 100a_nnb!
No, 100c is not in 100a_nnb!
No, 100c is not in 100b_ub!
Yes, 100c is in 100c_AGGtb!

这是为什么?似乎它跳过了第二个列表项。

问题在于用于创建第一个列表副本的这一行。这里两个变量都引用内存中的同一个列表,而不是创建副本。

my_list_2 = my_list

因此,当您从“复制”列表中删除值时,您将删除原始列表中的值。

为了创建原始列表的副本,使用 copy() 方法

my_list_2 = my_list.copy()

解决方案

[我]: my_list_2 = my_list.copy()

[二]: my_list_2 = my_list[::]

备注:

通过关注您只是将 my_list_2 引用到 my_list。

my_list_2 = my_list

如果您检查 id(my_list_2)id(my_list),您将拥有相同的 ID。