如何使用Python从循环中的数组中正确删除元素

如何使用Python从循环中的数组中正确删除元素,python,python-2.7,Python,Python 2.7,我尝试从数组中仅删除一个元素,并在循环中打印其余元素: arr = [1,2,3,4,5] for i in arr: a = arr a.remove(i) print a 所以我希望它能打印出这个: [2, 3, 4, 5] [1, 3, 4, 5] [1, 2, 3, 5] [1, 2, 3, 4] 为什么我会得到以下结果: [2, 3, 4, 5] [2, 4, 5] [2, 4] 这是深拷贝与浅拷贝的经典问题。 Python通过引用复制数组。因此,在您的情

我尝试从数组中仅删除一个元素,并在循环中打印其余元素:

arr = [1,2,3,4,5]
for i in arr:
    a = arr
    a.remove(i)
    print a
所以我希望它能打印出这个:

[2, 3, 4, 5]
[1, 3, 4, 5]
[1, 2, 3, 5]
[1, 2, 3, 4]
为什么我会得到以下结果:

[2, 3, 4, 5]
[2, 4, 5]
[2, 4]

这是深拷贝与浅拷贝的经典问题。 Python通过引用复制数组。因此,在您的情况下,对新变量a的任何更改都将反映在主数组arr中。从a中删除元素也会从arr中删除元素。 您需要使用以下命令创建副本

 a = arr[:] 

这不会从arr中删除任何元素。

您已经得到了解释,我将提供一个替代方案-您可以在不使用remove的情况下生成请求的输出:

请注意arr中的非唯一元素,如果有,此代码和您的代码都将产生意外的结果,尽管方式不同。

您可以尝试此方法

arr = [1, 2, 3, 4, 5, 6, 7 ]
for index, item in enumerate(arr):
    print(arr[0:index] + arr[index+1:])
我想这对你有帮助

如果没有任何重复值,也可以使用该值

for item in arr:
   print(set(arr) - set([item]))

Python列表是可变的,即修改诸如list.remove之类的操作不会生成新的列表,而是修改现有的列表,因此每个周期实际上都会永久性地修改源列表,并且元素会丢失。每次修改列表时,您都需要复制整个列表以实现所需,或者您可以创建一个排除元素的新列表,或者,对于非常长的列表,通过切片重建可能是最有效的方法:

arr = [1,2,3,4,5]
for i in range(len(arr)):
    a = arr[0:i] + arr[i+1:]
    print(a)

a=arr不创建arr的副本-大概您只需要a=arr[:]的可能副本我不确定这是否是副本,因为这个问题是问如何临时从数组中删除元素,实际上,意味着没有真正删除元素,而另一个正在询问如何永久删除元素。不太确定深度复制部分。这些项是整数,因此它们是不可变的。一个浅层的std副本可能也会有同样的效果,因为在本例中,我们实际上只关心容器对象。注意:当我谈到deep时,我指的是copy模块中使用的术语。你的是一个肤浅的副本-例如,如果它包含列表,你仍然会在它之后修改相同的项目。
arr = [1,2,3,4,5]
for i in range(len(arr)):
    a = arr[0:i] + arr[i+1:]
    print(a)