首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用slice迭代列表

使用slice迭代列表
EN

Stack Overflow用户
提问于 2019-09-24 00:51:05
回答 4查看 124关注 0票数 1

当我使用切片来迭代列表时,我得到了正确的输出。

代码:

代码语言:javascript
复制
words = ['cat', 'window', 'defenestrate']
for w in words[:]:
    if len(w) > 6:
        words.insert(0, w)

print(words) 

输出:

代码语言:javascript
复制
['defenestrate', 'cat', 'window', 'defenestrate']

但是,当我不使用切片进行迭代时,输出会进入无限循环。

代码:

代码语言:javascript
复制
words = ['cat', 'window', 'defenestrate']
for w in words:
    if len(w) > 6:
        words.insert(0, w)

print(w)

谁能解释为什么会出现这样的问题?

EN

回答 4

Stack Overflow用户

发布于 2019-09-24 00:55:10

这是因为切片创建了一个新对象。

以下是这些代码的工作原理:

第一个:

代码语言:javascript
复制
words = ['cat', 'window', 'defenestrate']
for w in words[:]:
    if len(w) > 6:
        words.insert(0, w)

print(words) 

在第一次使用words = ['cat', 'window', 'defenestrate']时,当你使用for w in words[:]时,它就像是在做:

代码语言:javascript
复制
temp = words.copy()
for w in temp:
   ...

要理解第二个代码的作用,可以运行以下代码:

代码语言:javascript
复制
words = ['cat', 'window', 'defenestrate'] 
for w in words: 
    print(words, w) 
    if len(w) > 6: 
        words.insert(0, w) 
    i += 1 
    if i == 15: break 

这将为您提供以下输出:

代码语言:javascript
复制
['cat', 'window', 'defenestrate'] cat
['cat', 'window', 'defenestrate'] window
['cat', 'window', 'defenestrate'] defenestrate
['defenestrate', 'cat', 'window', 'defenestrate'] defenestrate
['defenestrate', 'defenestrate', 'cat', 'window', 'defenestrate'] defenestrate
['defenestrate', 'defenestrate', 'defenestrate', 'cat', 'window', 'defenestrate'] defenestrate
.
.
.

在第三次迭代之后,for循环看到它已经向上迭代,直到word array的第三个元素,然后转到第四个元素。这也是defenestrate,所以它读取它,并将它添加到数组的开头,所以数组的长度变为5,同样的事情会一次又一次地发生。

票数 1
EN

Stack Overflow用户

发布于 2019-09-24 00:55:43

这是因为在遍历列表之前,切片会创建该列表的副本。当您插入到您正在迭代的列表中时,您正在添加更多要迭代的元素。

票数 0
EN

Stack Overflow用户

发布于 2019-09-24 00:55:59

因为在第一种情况下,切片的效果是将您正在循环的列表固定到原始列表。

在第二种情况下,您继续向列表中添加新元素,因此循环变得没有终点。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58066930

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档