Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/363.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么不是';当我尝试使用';对于';环_Python - Fatal编程技术网

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添加更多元素时,它都会永远运行。