【问题标题】:confused about looping through lists in python对在 python 中循环列表感到困惑
【发布时间】:2015-11-07 03:38:39
【问题描述】:

亲爱的 StackOverFlow, 我刚开始学习python,在循环列表方面我有点困惑。我一直在使用 Python.org 的官方 python 教程来学习。在此页面https://docs.python.org/2/tutorial/controlflow.html 的第 4.2 节中,在最后一个示例中,他们编写了以下代码:

for w in words[:]:
    if len(w) > 6:
        words.insert(0, w)

让我困惑的部分是for w in words[:]: 也许我需要更好地阅读他们的描述,但我似乎无法弄清楚为什么 前面的代码有效,而这无效:for w in words:。我想这让我很困惑,因为当我在解释器中输入 words[:] 时,当我在解释器中输入 words 时会得到相同的结果。如果您能对这个话题有所了解,我将不胜感激。

【问题讨论】:

  • words[:] 创建列表的副本。它是一个新的、独特的对象。当您插入原始列表时,它不会改变。见How to clone or copy a list in Python?
  • 我会澄清它的长度和它指向的地址不会改变,但如果复制的list包含其他可变对象(如lists),整体内容可能会改变。

标签: python list loops slice


【解决方案1】:

for 循环中,您将元素插入到words 列表中。如果您直接迭代 words 列表,您插入的元素将影响迭代。通常,在修改您正在迭代的列表时,您可能会得到不正确的结果,可能会引发异常,或者您甚至可能会随着列表的增长而出现无限循环,直到您耗尽内存。

在您的特定情况下,如果len(w) > 6 的列表中有任何w,您将获得无限循环。假设您有列表word = ['len(this) == 15']。在第一次迭代中,由于len(w) > 6,它将在words 的位置0 处插入w,因此将列表中的所有其他内容向前推。所以现在words 等于['len(this) == 15', 'len(this) == 15']。现在for 循环检查是否有下一个元素;肯定会有,因为您刚刚在位置 0 处插入了一个元素,所以 for 循环再次迭代。当然,w 包含与上次迭代中相同的值,所以会发生同样的事情。到无限,甚至更远!

【讨论】:

  • 非常感谢!我想我现在明白了。所以我遍历列表的副本但修改了原始列表,所以我不会影响迭代过程,可能会创建无限循环或导致异常。感谢先生的帮助。
  • @yoprogrammer,不客气。如果您也可以投票,我将不胜感激:)。这是the SO way
  • 肯定会投票,但我这样做似乎有问题。一旦我对您的帖子投赞成票,它就会自动将其投反对票归零。不知道为什么会这样......
猜你喜欢
  • 2023-01-13
  • 2018-10-03
  • 2016-12-27
  • 2016-07-13
  • 2017-05-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-09
相关资源
最近更新 更多