Py学习  »  Python

理解python中的列表

Carlos Romero • 4 年前 • 778 次点击  

我目前正在学习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测试这一切。

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/56794
 
778 次点击  
文章 [ 3 ]  |  最新文章 4 年前
greg
Reply   •   1 楼
greg    4 年前

试着看看下面的代码。它应该有助于你了解幕后发生的事情:

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 range
Tarik
Reply   •   2 楼
Tarik    4 年前

在第二个例子中,list(arr)创建了一个新副本,并且由于它在迭代期间从未被修改过,所以它的所有元素都被指向,然后从原始列表中移除。

JohnkaS
Reply   •   3 楼
JohnkaS    4 年前
for i in arr:
   ...

内部使用索引从数组中移除元素,这意味着如果移除第一个元素,它将继续索引2(即索引3),移除3,然后转到索引4,然后继续。。。

但是,第二个不执行此操作,而是实际遍历每个值并删除它,因为在删除期间数组不会调整大小