【问题标题】:pop() method in python lists doesn't work properlypython 列表中的 pop() 方法无法正常工作
【发布时间】:2013-03-31 00:36:54
【问题描述】:

当我在 Python 2.7.3 中执行以下代码时:

#!/usr/bin/env python
# -*- coding: utf-8 -*-


class A(object):
    def __init__(self):
        self.s = []


class B(object):
    def __init__(self):
        self.a = A()


class C(object):
    def __init__(self):
        self.b = B()


c = C()

print c.b.a.s

c.b.a.s.append(1)
c.b.a.s.append(2)
c.b.a.s.append(3)
c.b.a.s.append(4)
c.b.a.s.append(5)

print c.b.a.s

for element in c.b.a.s:
    print c.b.a.s.pop()

print c.b.a.s

我得到了输出:

[]
[1, 2, 3, 4, 5]
5
4
3
[1, 2]

但我希望 for 语句会弹出列表中的所有元素并将 c.b.a.s 保留为 []。

问题: 我在代码中省略了某些内容,还是 pop() 方法有问题?

【问题讨论】:

  • 改用for i in range(len(c.b.a.s))

标签: python list built-in


【解决方案1】:

您不应该在迭代列表时修改它!

试试

for _ in range(len(c.b.a.s)):
    c.b.a.s.pop() 

改为

【讨论】:

  • 我希望它会失败,因为非空数组的真值是模棱两可的......嗯,或者我可能在弥补......
  • 真值不是模棱两可的!见this
  • @SuperUser:虽然这两种方法都可以工作(而且,在有人提出反对意见之前,速度足够快,性能可能无关紧要),但它们对人类读者有不同的含义。所以,做一个表达你的意思的人。
  • @JoranBeasley:numpy 数组故意不是序列或集合。你所争论的等同于说a + b 不会返回b 附加到a 的两个序列,因为它为numpy 数组返回不同的东西。
  • 我不是在争论......我只是说我记得为什么我不认为非空数组的真值,并确保我没有完全发疯。我现在显然知道python数组的真值是明确的:)
【解决方案2】:

除非您真正了解其底层实现,否则在使用 for 循环迭代时修改可迭代对象通常是一个坏主意。相反,请使用如下循环结构:

while len(c.b.a.s):
    element = c.b.a.s.pop()
    print element, c.b.a.s

【讨论】:

  • len 在这种情况下是不必要的,因为如果列表不为空,则评估结果为 True,因此 while c.b.a.s: 的运行速度与 for _ in xrange(len(c.b.a.s)): 大致相同。然而,调用 len 似乎只慢了 25%。
  • 我不确定那总是正确的......我确定我收到了关于非空数组的真值未定义的错误消息,但是我不确定在哪些情况下会失败......
  • @JoranBeasley 我认为this 是使用Python 最简单、最优雅的方式。 _ 变量、range()、xrange() 和 len() 函数只是无用地重载代码。
  • len 不需要重新计算,因为它存储在list 中。不要因为性能原因而放弃它,因为它们几乎肯定与任何现实生活中的用例无关。不使用它,因为它会使代码变得更长、更复杂而没有任何好处。
【解决方案3】:

您知道,问题与您的班级结构无关。发生的事情是你如何使用流行音乐。由于您正在积极修改您正在迭代的列表,因此当前迭代的内部索引最终将超过列表的实际大小,从而导致 for 循环退出。

如果你想使用pop清空一个列表,你应该找出运行pop的次数(即列表的大小)并运行了多少次:

for el in xrange(len(c.b.a.s)):
   c.b.a.s.pop()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-02-07
    • 2014-04-26
    • 1970-01-01
    • 2016-04-01
    • 1970-01-01
    • 2021-08-18
    • 1970-01-01
    • 2021-10-01
    相关资源
    最近更新 更多