微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

这段代码中list [:]的含义是什么?

如何解决这段代码中list [:]的含义是什么?

这是陷阱之一!python,可以逃脱初学者。

words[:]是这里的魔术酱。

观察:

>>> words =  ['cat', 'window', 'defenestrate']
>>> words2 = words[:]
>>> words2.insert(0, 'hello')
>>> words2
['hello', 'cat', 'window', 'defenestrate']
>>> words
['cat', 'window', 'defenestrate']

现在没有[:]

>>> words =  ['cat', 'window', 'defenestrate']
>>> words2 = words
>>> words2.insert(0, 'hello')
>>> words2
['hello', 'cat', 'window', 'defenestrate']
>>> words
['hello', 'cat', 'window', 'defenestrate']

这里要注意的主要事情是words[:]返回copy现有列表的a,因此您要遍历未修改的副本。

您可以使用以下命令检查是否引用了相同的列表id()

在第一种情况下:

>>> words2 = words[:]
>>> id(words2)
4360026736
>>> id(words)
4360188992
>>> words2 is words
False

在第二种情况下:

>>> id(words2)
4360188992
>>> id(words)
4360188992
>>> words2 is words
True

值得注意的是,[i:j]它称为 切片运算符 ,它的作用是从index开始i,直到(但不包括)index ,返回列表的新副本j

所以,words[0:2]给你

>>> words[0:2]
['hello', 'cat']

省略起始索引意味着它认为0,而省略最后一个索引意味着它认为len(words),最终结果是您收到了 整个 列表的副本。

如果您想使代码更具可读性,建议您使用该copy模块。

from copy import copy

words = ['cat', 'window', 'defenestrate']
for w in copy(words):
    if len(w) > 6:
        words.insert(0, w)
print(words)

基本上,这与您的第一个代码段相同,并且可读性更高。

另外(如DSM在评论中所提到的)和在python> = 3上,您也可以使用words.copy()后者执行相同的操作。

解决方法

此代码来自Python的文档。我有点困惑。

words = ['cat','window','defenestrate']
for w in words[:]:
    if len(w) > 6:
        words.insert(0,w)
print(words)

以下是我最初的想法:

words = ['cat','defenestrate']
for w in words:
    if len(w) > 6:
        words.insert(0,w)
print(words)

为什么这段代码会创建一个无限循环,而第一个却没有呢?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。