为什么当我尝试使用"for"循环更改列表的值时代码不起作用(在这里)?



假设有这样一个随机列表:

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']

再次长度增加,依此类推.. 所以迭代无法到达最后,它不断变化和变化,在这种情况下你会到达 的值

最新更新