假设有这样一个随机列表:
st=['smthg','xyz','random','000','666']
我想使用这个 for 循环将索引 1 的值更改为 3:
for anythg in st:
st[1:3]='whtevr'
shell(IDLE( 对此没有任何响应,命令行冻结(cmdln,但是,在中断执行并键入"st"后,它开始显示:
't','e','v','r','t','e','v','r','t','e','v','r','t','e','v','r','t','e','v',
无休止,直到再次按 ctrl+C (。
我知道正确执行的正确方法是:
for i in range(1,4):
st[i]='whtevr'
不过,我期待一个答案,为什么前一个不起作用?(仍然是一个初学者问题。
*
首先,在代码中:
for anythg in st:
st[1:3]='whatever'
你不需要循环,因为那只会重复两次相同的动作。
st[1:3]='whatever'
st[1:3]
意味着['xyz', 'random']
。当您将其分配给'whatever'
时,它只会更改这两个变量:
['smthg', 'w', 'h', 'a', 't', 'e', 'v', 'e', 'r', '000', '666']
它用'whatever'
替换了['xyz', 'random']
。这就是导致您看到的行为的原因。
这个列表还在不断增加。
>>> st=['smthg','xyz','random','000','666']
>>> st[1:3]='whtevr'
>>> st
['smthg', 'w', 'h', 't', 'e', 'v', 'r', '000', '666']
>>> st[1:3]='whtevr'
>>> st
['smthg', 'w', 'h', 't', 'e', 'v', 'r', 't', 'e', 'v', 'r', '000', '666']
>>> st[1:3]='whtevr'
>>> st
['smthg', 'w', 'h', 't', 'e', 'v', 'r', 't', 'e', 'v', 'r', 't', 'e', 'v', 'r', '000', '666']
>>> st[1:3]='whtevr'
>>> st
['smthg', 'w', 'h', 't', 'e', 'v', 'r', 't', 'e', 'v', 'r', 't', 'e', 'v', 'r', 't', 'e', 'v', 'r', '000', '666']
>>> st[1:3]='whtevr'
>>> st
['smthg', 'w', 'h', 't', 'e', 'v', 'r', 't', 'e', 'v', 'r', 't', 'e', 'v', 'r', 't', 'e', 'v', 'r', 't', 'e', 'v', 'r', '000', '666']
列表开头为
>>> ['smthg','xyz','random','000','666'][1:3]
['xyz', 'random']
但继续永远增长,并且循环永远不会结束。
您可以使用 enumerate
使用列表推导,并使用 if/else 检查索引
st = ['smthg','xyz','random','000','666']
new_st = ['wtevr' if 0 < i < 4 else ele for i, ele in enumerate(st)]
# ['smthg', 'wtevr', 'wtevr', 'wtevr', '666']
如果你想坚持你的版本,你应该先创建一个原始列表的副本,然后更改副本中的元素
st=['smthg','xyz','random','000','666']
new_st = st[:]
for i in range(len(new_st)):
if 0<i<4:
new_st[i]='whtevr'
为列表切片赋值时,它期望右手表达式是可迭代的。然后,它将该切片替换为可迭代对象。当您尝试分配字符串时,它被视为字符列表。
例如
l = [1,2,3,4,5]
l[1:3] = 'abc'
print(l)
# [1, 'a', 'b', 'c', 4, 5]
在您的情况下,这种'whtevr'
的插入导致了无限循环。
因为你一直在改变列表,所以你不断地遍历列表,然后一次又一次地修改它,并迭代该列表
因此,在第一次迭代中,您的列表变为
['smthg', 'w', 'h', 'a', 't', 'e', 'v', 'e', 'r', '000', '666']
查看 ST 变化的长度
现在对于上面修改的列表的第二次迭代,它变成了
['smthg', 'w', 'h', 'a', 't', 'e', 'v', 'e', 'r', 'a', 't', 'e', 'v', 'e', 'r', '000', '666']
再次长度增加,依此类推.. 所以迭代无法到达最后,它不断变化和变化,在这种情况下你会到达 的值