社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

理解python中的列表

Carlos Romero • 4 年前 • 755 次点击  

我目前正在学习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
 
755 次点击  
文章 [ 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,然后继续。。。

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