Python 从数组中删除元素时列表索引超出范围

Python 从数组中删除元素时列表索引超出范围,python,python-3.x,Python,Python 3.x,我知道这是一个基本的问题,但这里很奇怪 我不知道为什么会出现这样的错误。请帮我做这个。提前谢谢 arr = [11,22,33,44,55,66,77] brr = [1,2,3,4,55] res_arr = arr for i in range(len(arr)): if arr[i] in brr: res_arr.remove(arr[i]) 给我错误列表索引超出范围 有什么线索吗 编辑: arr = [11,22,33,44,55,66,77] brr =

我知道这是一个基本的问题,但这里很奇怪

我不知道为什么会出现这样的错误。请帮我做这个。提前谢谢

arr = [11,22,33,44,55,66,77]
brr = [1,2,3,4,55]
res_arr = arr

for i in range(len(arr)):
    if arr[i] in brr:
        res_arr.remove(arr[i])
给我错误列表索引超出范围

有什么线索吗

编辑:

arr = [11,22,33,44,55,66,77]
brr = [1,2,3,4,55]
print([i for i in arr if i not in brr])
[11, 22, 33, 44, 66, 77]
import copy
res_arr = copy.deepcopy(arr)
这帮助我解决了这个错误


res\u arr=list(arr)
使用
列表理解
。在迭代时删除元素不是一个好主意。而且,
res_arr=arr
不会做你想做的事。您需要了解如何在python中复制对象

Ex:

arr = [11,22,33,44,55,66,77]
brr = [1,2,3,4,55]
print([i for i in arr if i not in brr])
[11, 22, 33, 44, 66, 77]
import copy
res_arr = copy.deepcopy(arr)
输出:

arr = [11,22,33,44,55,66,77]
brr = [1,2,3,4,55]
print([i for i in arr if i not in brr])
[11, 22, 33, 44, 66, 77]
import copy
res_arr = copy.deepcopy(arr)
可以使用copy模块在python中复制对象

Ex:

arr = [11,22,33,44,55,66,77]
brr = [1,2,3,4,55]
print([i for i in arr if i not in brr])
[11, 22, 33, 44, 66, 77]
import copy
res_arr = copy.deepcopy(arr)

res\u arr=arr
不复制列表。因此,当您在相同的列表=>复合副本上迭代时,您正在删除项目。您正在从与
arr
长度相同的
res\u arr
中删除项目。当您删除项目时,列表会越来越短,因此会出现错误。假设您有两个包含6个元素的列表。然后,您将拥有从0到5的索引。如果您碰巧从第二个列表中删除了一个项目,则与原始项目相比,该项目将少一个元素。有两种方法可以解决此问题:*而不是复制列表并删除元素。只需使用您想要的元素创建一个新的。*复制列表,而不是从头到尾删除项目,而是从头到尾删除项目,这样您就不会有超出范围的问题。@Jean Françoisfare说得对,您不应该从正在迭代的列表中删除项目,但是这种情况下的错误是因为
remove(item)
不会删除值为
item
的项,但索引
处的元素确实很糟糕,因为jesse Bakker从您迭代的列表中删除的信息非常有用,而且他没有复制列表。然而,他得到的错误是因为list.remove(i)删除了索引i处的元素,而不是具有值iNo的元素,该值不需要用于
copy
,而是用于更复杂的对象。使用
res\u arr=list(arr)
。他问
为什么我的错误会发生
,而不是
如何解决这个问题
。即使他的问题的答案是好的莫先生,这很有帮助,谢谢。拉凯什,你的回答也很有效。谢谢