为了求职面试的目的,我目前正在学习python。关于python中的列表,我正在尝试理解以下内容:
为什么下面两段代码会产生不同的输出?
arr = [1,2,3,9,10,12]
for i in arr:
arr.remove(i)这将导致列表2,9,12,但如下所示:
arr = [1,2,3,9,10,12]
for i in list(arr):
arr.remove(i)这将产生所需的空列表[]。有人能解释一下为什么会这样吗?既然remove()按项值移除,那么以第一种方式迭代列表不是也会导致一个空列表吗?
免责声明,我正在通过HackerRank使用Python3测试这一切。
发布于 2020-02-01 04:31:21
for i in arr:
...内部使用索引从数组中删除元素,这意味着如果第一个元素被删除,它将继续索引2,这是3,它删除3,然后转到索引4,然后继续...
然而,第二个并不这样做,它实际上遍历每个值并将其删除,因为在删除过程中数组不会调整大小
发布于 2020-02-01 04:44:08
迭代器首先指向位置0,然后删除第一个条目2。然而,在第二次迭代中,它指向位置1,但是您的列表变成了2,3,9,10,12,因此它删除了3(位置1中的元素)。因此,列表中的第一个元素永远不会被删除,出于同样的原因,随着迭代器的移动,它会跳过所有其他元素。在第二个例子中,list(arr)创建了一个新的副本,因为它在迭代期间从未被修改过,所以它的所有元素都指向原始列表,然后从原始列表中删除。
一般来说,在迭代集合时从集合中移除元素是不好的。
发布于 2020-02-01 04:44:50
试着看一下下面的代码。它应该可以帮助您了解幕后发生的事情:
arr = [1,2,3,9,10,12]
index = 0
for i in arr:
print('First print: ', i, index, arr[index])
arr.remove(i)
print('Second print: ', i, index, arr[index])
index += 1
# ('First print: ', 1, 0, 1)
# ('Second print: ', 1, 0, 2)
# ('First print: ', 3, 1, 3)
# ('Second print: ', 3, 1, 9)
# ('First print: ', 10, 2, 10)
# ('Second print: ', 10, 2, 12)
arr = [1,2,3,9,10,12]
index = 0
for i in list(arr):
print('First print: ', i, index, arr[index])
arr.remove(i)
print('Second print: ', i, index, arr[index])
index += 1
# ('First print: ', 1, 0, 1)
# ('Second print: ', 1, 0, 2)
# ('First print: ', 2, 1, 3)
# ('Second print: ', 2, 1, 9)
# ('First print: ', 3, 2, 10)
# ('Second print: ', 3, 2, 12)
# Traceback (most recent call last):
# File "<stdin>", line 2, in <module>
# IndexError: list index out of rangehttps://stackoverflow.com/questions/60010804
复制相似问题