当前位置: 首页 > 面试题库 >

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

袁文景
2023-03-14
问题内容

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

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:
    if len(w) > 6:
        words.insert(0, w)
print(words)

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


问题答案:

这是陷阱之一!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()后者执行相同的操作。



 类似资料: