Python 为什么不是';当我尝试使用';对于';环
假设有一个随机列表:Python 为什么不是';当我尝试使用';对于';环,python,Python,假设有一个随机列表: st=['smthg','xyz','random','000','666'] 我想使用以下for循环将索引1的值更改为3: for anythg in st: st[1:3]='whtevr' shell(空闲)对此不给出任何响应,命令行冻结(但是,在中断执行并键入“st”后,cmdln开始显示: 't','e','v','r','t','e','v','r','t','e','v','r','t','e','v','r','t','e','v', 无休
st=['smthg','xyz','random','000','666']
我想使用以下for循环将索引1的值更改为3:
for anythg in st:
st[1:3]='whtevr'
shell(空闲)对此不给出任何响应,命令行冻结(但是,在中断执行并键入“st”后,cmdln开始显示:
'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'
尽管如此,我还是在期待前一个为什么不起作用的答案?
(还是一个初学者的问题。)
*您可以使用枚举
并使用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=['wtevr'如果0
如果要坚持使用您的版本,应首先创建原始列表的副本,然后更改副本中的元素
st=['smthg','xyz','random','000','666']
new_st = st[:]
for i in range(len(new_st)):
if 0<i<4:
new_st[i]='whtevr'
st=['smthg'、'xyz'、'random'、'000'、'666']
新的_st=st[:]
对于范围内的i(len(new_st)):
如果0首先,在代码中:
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']
它将['xyz','random']
替换为'whatever'
。这就是导致您看到的行为的原因。将值赋给列表片段时,它希望右侧表达式是一个iterable。然后用iterable替换该切片。当您尝试分配字符串时,它将被视为字符列表
比如说,
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']
再次,长度增加,等等。。所以迭代无法到达末尾,因此
不断地改变,在这种情况下你就会被联系到
这个列表的值一直在增加
>>> 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']
但是会一直持续增长,而且循环永远不会结束,因为不断增长的列表您不应该修改正在迭代的列表。您应该复制一份。您在迭代列表时正在更改列表st
,这从一开始就是一个红色标志。最让你头疼的是赋值st[1:3]='whtevr'
因为st[1:3]
是一个列表片,它把whtevr
当作一个可数。因此,它将1:3范围内的两个元素(即元素1和2)替换为6个元素'w'
,'h'
,'t'
,'e'
,'v'
,'r'
。然后,它继续一次又一次地迭代,每次将列表增加4个元素。它永远不会结束。你需要问自己的是,你希望结果是什么样的?代码或描述中不清楚。@Tom Karzes。我只是想让结果看起来像使用某些替换函数(不存在)后的结果。然后,我搞砸了(这导致了这个问题)。@The_L0s3r.:下面的任何答案都能解决您的问题吗?如果他们这样做了,那么就把你认为最好的答案标记为被接受。由于您似乎对堆栈溢出还不熟悉,您应该阅读一下,在替换它一次之后,它不应该停止吗?(cmdln不断给出't'、'e'、'v'、'r'作为输出)当您为st中的任何对象写入时,它运行的次数与st中的元素相同。因为每次向st添加更多元素时,它都会永远运行。