【问题标题】:What exactly is del doing here? [duplicate]del 到底在做什么? [复制]
【发布时间】:2019-07-03 09:57:02
【问题描述】:

我正在学习 python,我想创建一些代码来获取列表,检查每一行是否具有给定索引号的特定值,如果有,则删除整行。现在我凭直觉决定使用del 删除行,但是当我打印出带有已删除值的列表时,我得到了相同的列表。我添加了一个计数器来检查是否有任何行具有要删除的值并且它们确实存在。以下代码说明了我遇到的问题:

test_list=[1,2,3,4,5]
for element in test_list:
    if element == 1:
        del element
print (test_list)

输出

[1,2,3,4,5]

如果不删除这里的元素,del的作用是什么?

【问题讨论】:

  • 应该检查给定的for循环代码。这是不正确的。只需使用 del()remove()pop() 函数来执行您的任务。

标签: python


【解决方案1】:

实际上,del 在您的代码中什么都不做。它只是删除了对迭代变量的本地绑定(而不是列表元素,即使它们指向同一个对象)。这对列表没有影响,无论如何在下一次迭代中,变量将被分配给下一个值。

对于一般情况,如果您想使用 del 删除列表中的一个元素(并且您不知道它的位置),您必须这样做:

delete_me = 1
for i in range(len(test_list)-1, -1, -1):
    if test_list[i] == delete_me:
        del test_list[i]

请注意del 对列表的作用,以及我们需要反向遍历列表以避免在迭代列表的同时修改列表时出现问题。

不过,还有一种更简单的方法——根本不使用del,而是使用列表理解:

delete_me = 1
test_list = [x for x in test_list if x != delete_me]

【讨论】:

  • 没有意义在这里迭代只是删除/弹出索引
  • @Chris_Rands 假设您事先知道该元素位于第一个位置,但情况可能并非总是如此。
  • 不过,使用remove() 函数会更好
  • @Chris_Rands 是的。但是如果你按照我的回答那样做就没有问题了。
  • @RickHitchcock 当然,如果你把它放在一个循环中它会工作,但它会非常低效和非 Pythonic :) 。嘿,我在这里回答了两个 OP 的两个问题:P 希望我能投赞成票!
【解决方案2】:

del 正在删除对对象 element 的引用。这不是对列表元素的引用。

【讨论】:

    【解决方案3】:

    您正在删除一个名为 element 的临时变量,该变量在 test_list 的每次迭代中创建。

    如果您想从列表中删除项目,请使用 removedel list[index]

    更多:https://www.tutorialspoint.com/python/list_remove.htm
    How to remove an element from a list by index?
    Is there a simple way to delete a list element by value?

    【讨论】:

      【解决方案4】:

      del 关键字用于删除对象。在 Python 中,一切都是对象,因此del 关键字也可以用于删除变量、列表或列表的一部分等。

      https://www.w3schools.com/python/ref_keyword_del.asp

      【讨论】:

      • 我认为来源是w3schools
      • 投反对票,因为无论如何,答案都不是真正的解释性。 OP 显然对 del 对列表的影响感到困惑,而您的回答未能解决这个问题。
      猜你喜欢
      • 2014-01-29
      • 2014-11-11
      • 2016-09-22
      • 1970-01-01
      • 2020-07-16
      • 1970-01-01
      • 1970-01-01
      • 2016-06-02
      • 2016-02-12
      相关资源
      最近更新 更多