【问题标题】:Python: Using del in for loopsPython:在 for 循环中使用 del
【发布时间】:2013-11-18 03:38:54
【问题描述】:

当我意识到 del 似乎不起作用时,我正在使用 for 循环遍历列表。我认为这是因为 i 代表 for 循环的一个对象,而 del 只是删除该对象而不是引用。

然而,我确信我以前做过类似的事情,并且成功了。

alist = [6,8,3,4,5]  

for i in alist:  
    if i == 8:  
        del i  

在我的代码中它实际上是一个字符串列表,但结果是一样的:即使满足 if 条件,删除 i 也没有效果。

有没有办法可以通过这种方式删除数字或字符串?我是不是做错了什么?

谢谢。

【问题讨论】:

    标签: python for-loop del


    【解决方案1】:

    for 循环在每次运行时为 i 分配一个新值。

    所以,基本上,你上面的 for 循环确实

    i = 6
    i = 8
    del i
    i = 3
    i = 4
    i = 5
    

    没有效果。

    【讨论】:

      【解决方案2】:

      您对为什么看到这种行为的想法是正确的。因此,我不再赘述。

      如需,请使用list comprehension 过滤列表:

      >>> alist = [6,8,3,4,5]
      >>> [x for x in alist if x != 8]
      [6, 3, 4, 5]
      >>> alist = [6,8,8,3,4,5]
      >>> [x for x in alist if x != 8]
      [6, 3, 4, 5]
      >>>
      

      这种方法也比 for 循环更有效。

      【讨论】:

      • 嗯。如果你这样做alist = [6, 8, 8, 3, 4, 5]会发生什么?
      • 是的,这很完美。谢谢。
      • @NickSimas - 实际上,我的旧帖子是错误的。我觉得不对。 :*) 我的新版本是您应该使用的。
      • 你为什么不喜欢你的第一个答案?这是我正在寻找的确切答案。
      • 尝试使用@glglgl 提供的示例列表运行它。它不会摆脱所有的8。当前的将。
      【解决方案3】:

      如果你真的想用del你需要用它就行了:

      del alist[i]
      

      (请注意,在这种情况下,i 是一个索引,而不是您要删除的值)

      但实际上,您可能应该只使用列表推导创建另一个列表:

      [x for x in alist if x != 8]
      

      【讨论】:

      • 如果 i == 8,del alist[i] 会引发 IndexError。您应该清楚 i 是一个 INDEX,而不是问题中的 i - 这是 VALUE。跨度>
      【解决方案4】:

      del 不会删除对象。它只是减少其参数引用的对象的引用计数。在你的代码中

      alist = [6,8,3,4,5]  
      
      for i in alist:  
          if i == 8:  
              del i
      

      您有 6 个对象:5 个单独的整数,以及一个包含 5 个引用的列表(每个整数一个)。 for 循环通过在 alist 中的每个元素执行一次其主体来工作,i 在每次迭代中都持有对 alist 中不同元素的引用。 i 引用的任何对象的引用计数至少为 2:alisti 本身持有的引用。当您调用del i 时,您只是通过使i 指向任何内容来减少其引用计数。

      虽然以下技术上有效,但通过删除对对象的所有(已知)引用,它有其自身的问题(涉及修改您当前正在迭代的列表)并且不应使用。

      >>> alist=[6,8,3,4,5]
      >>> for i, a in enumerate(alist):
      ...   if a == 8:
      ...     del a        # delete the loop index reference
      ...     del alist[i] # delete the reference held by the list
      >>> alist
      [6,3,4,5]
      

      相反,只需使用列表推导构建一个新列表来替换旧列表

      alist = [ x for x in alist if x != 8 ]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-09-28
        • 1970-01-01
        • 2021-05-27
        • 2018-12-03
        • 2014-06-19
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多