【问题标题】:What does [:] mean in the context of "for nm in namesList[:]:" [duplicate][:] 在“for nm in namesList [:]:”的上下文中是什么意思 [重复]
【发布时间】:2021-07-19 03:30:08
【问题描述】:

我目前正在学习 Python,但我很难理解切片 [:] 在下面显示的 for 循环中的作用。
我没有找到关于[:] 语法的任何问题,所以我发布了一个问题。

我知道写 namesList[2:] 会从索引 2 中分割列表:['three', 'four', 'five']
并且namesList[:2] 将分割列表直到索引 1:['one', 'two']

  1. 如果在 for 循环中我只放了for nm in namesList:,它就会卡在一个无限循环中,不断地在索引 0 中插入“四”。为什么卡住了?
  2. 根据我在调试中看到的情况,在带有namesList[:] 的for 循环中,它从停止的地方继续。但是为什么namesList: 不会继续,而namesList[:] 会呢? [:] 是如何工作的,语法是什么意思?

names = "one two three four five"
namesList = names.split()    
for nm in namesList[:]:
    if nm[0] == "f":
        namesList.insert(0, nm)
print(namesList)

# Output:
['five', 'four', 'one', 'two', 'three', 'four', 'five']

names = "one two three four five"
namesList = names.split()    
for nm in namesList:
    if nm[0] == "f":
        namesList.insert(0, nm)
print(namesList)

# Infinite loop

【问题讨论】:

标签: python


【解决方案1】:

这是一个很好的(如果有点武断的话)示例,为什么您不应该在 迭代 列表(或其他数据结构)时对其进行修改

在您的第二个代码中,您的循环最终到达four,因此决定在列表的开头插入一些内容。

但这会将列表中的所有其他元素向前移动一个,循环不知道,所以现在它再次看到four。一次又一次……

切片的作用本质上是创建列表的副本。这样,循环只会在列表的 original 部分上运行,因此可以保存修改该列表。

它复制您的列表的原因是一般 my_list[3:5] 左右会选择从第一个索引开始并运行到(但不包括)最后一个索引的元素。如果省略第一个索引,则默认为 0,如果省略最后一个索引,则默认为 最后一个元素,因此 [:] 仅表示“选择所有元素,从 0 到最后一个”。

【讨论】:

  • 感谢您详细解释为什么 [:] 复制原始列表。我同意你不应该在迭代列表时修改它,这只是我正在学习的讲座使用的示例。
  • 除了回答一个非常常见的重复项之外,您的回答只是间接地解释了为什么会发生这种情况。 列表切片按定义返回副本。 这不是微不足道的,并非所有 python 中的切片都创建副本。
猜你喜欢
  • 2021-05-31
  • 1970-01-01
  • 2017-12-02
  • 2013-10-22
  • 2015-10-19
  • 1970-01-01
  • 1970-01-01
  • 2018-05-07
  • 1970-01-01
相关资源
最近更新 更多