如何解决这段代码中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)
,最终结果是您收到了 整个 列表的副本。
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 举报,一经查实,本站将立刻删除。