所以我试图从数组中删除元素并使用此数组进行一些计算。问题是,我想保留原始数组的副本,所以我创建了一个新数组并为其分配了原始数组的值。问题是,每当我打印出原始数据和新数组的长度时,它给出了相同的长度,但它给了我新数组的长度。如何使用与' a'相同的值创建新数组,但不更改' a'
a = [2, 4, 5, 7, 8, 9]
b = []
b = a
for _ in range(2):
m = min(b)
b[:] = (x for x in b if x != m)
print(len(b))
print(len(a))
答案 0 :(得分:4)
说b = a
只是创建一个引用现有列表对象的新变量。要制作列表的副本,您可以使用list()
函数或列表切片:
b = list(a)
b = a[:]
也就是说,要从现有的列表中创建一个新的列表,过滤掉一些元素,你可以使用列表理解:
from heapq import nsmallest
m = nsmallest(2, a)
b = [x for x in a if x not in m]
答案 1 :(得分:1)
list
和list[:]
之间存在差异
阅读时,list
是对原始列表的引用,list[:]
浅表复制列表。
分配时,list
(重新)绑定名称和list[:]
切片分配,替换以前列表中的内容。
但是,如果list
元素本身就是列表,即使list1 = list[:]
也存在问题。考虑:
>>> a = [[1,2,3],[4,5,6],[7,8,9]]
>>> b = a[:]
>>> b[0].remove(2)
>>> b
[[1, 3], [4, 5, 6], [7, 8, 9]]
>>> a
[[1, 3], [4, 5, 6], [7, 8, 9]]
这是因为复制到b的每个列表元素本身就是一个列表,这种列表复制涉及与普通list1 = list2
相同的问题。最简单的方法是以这种方式显式复制每个列表元素:
>>> a = [[1,2,3],[4,5,6],[7,8,9]]
>>> b=[[j for j in i] for i in a]
>>> b
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
>>> b[0].remove(2)
>>> b
[[1, 3], [4, 5, 6], [7, 8, 9]]
>>> a
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
答案 2 :(得分:1)
你没有复制 - 你是别名。你给同一个数组(这是一个列表btw)的第二个名称。尝试b = a[:]
这将复制它 - 仅在列表内容不可变时才有效。
如果您的列表包含其他列表,它将"复制"对该列表的引用,但不是嵌套列表内容 - 这将是deepcopy()。
如果你想删除最低的2,你也可以求助于排序和切片(你的列表已经排序,所以不需要排序)
a = [2, 4, 5, 7, 8, 9]
b = a[2:] // slice, ignore first 2 entries which are the lowest 2
c = sorted(a)[2:] // implicitly creates a new sorted list, ignore lowest 2
print(b)
print(c)
输出:
[5, 7, 8, 9]
[5, 7, 8, 9]