Python数据结构:Python中两种类型的for循环之间的区别?

Python数据结构:Python中两种类型的for循环之间的区别?,python,Python,我想这个问题应该被问到,但是我在评论部分找不到,让我知道如果有,我会删除这个帖子 我注意到,当我们进行列表替换时,只有在按索引循环列表时,它才起作用。为什么? myList = ['a','b','c','d','e'] for item in myList: if item == 'a': item = 's' print("First loop:",myList) //It prints ['a','b','c','d','e'] for i

我想这个问题应该被问到,但是我在评论部分找不到,让我知道如果有,我会删除这个帖子

我注意到,当我们进行列表替换时,只有在按索引循环列表时,它才起作用。为什么?

myList = ['a','b','c','d','e']
for item in myList:
    if item == 'a':
        item = 's'
print("First loop:",myList)           //It prints ['a','b','c','d','e']


for i in range(len(myList)):
    if myList[i] == 'a':
        myList[i] = 's'
print("Second loop:",myList)          //It prints ['s','b','c','d','e']

我试图阅读python控制流文档:但它并没有真正回答我的问题。

在第一个循环中,行项='s'仅更改循环中区域设置变量项的值,该值在每次迭代中由列表中的下一个值更新。它不是对列表本身的引用。

在您的第一个for循环中,item只是一个变量,它被分配给循环要访问的任何列表项。重新分配变量不会影响列表。在第二个循环中,您直接更改列表项,这就是为什么在打印列表时它会显示出来

在第一个循环的每次迭代中,变量项被分配给列表中的每个项。如果满足if条件,则只需将变量项重新分配给“s”,但这不会更改列表的内容

在第二个循环中,您将重新分配my_列表的内容,就像您将第i个项目分配给带有行的“s”一样

    myList[i] = 's'
另请考虑一个更简单的示例:

    myList = ['a', 'b', 'c']
    item = myList[0]  # assign item to 'a'
    item = 's'  # re-assign item variable to 's', does not change list
    myList[0] = 's'  # change the content of the first item in the list

还可以查看以下内容:

有关为什么第一个循环不工作的示例,请检查以下内容:

myList = ['a','b','c','d','e']
item = myList[0]
item = 's'

# this is an example equivalent to what the first loop does
# the values in myList remain unchanged
以及一个与第二个循环等效的示例:

myList = ['a','b','c','d','e']
myList[0] = 's'

# the first value in myList is changed to 's'

分配给一个名称与分配给一个索引名称根本不同,在索引名称中myList[i]='s'实际上是一个方法调用myList.\uu setitem\uu i,'s'。在你倒数第二行中,我认为你的意思是使用=,而不是=。@Markus good call,这是一个愚蠢的输入错误。@chepner第一个循环也是这样做的:item=myList[index],由于它存储在一个局部变量中,它不会影响原始列表?因此在一般的列表操作中,最好使用索引?Yes访问该项。否则,您必须构建一个新的列表,或者使用函数索引查找当前项的索引,在多个相同值的情况下,该索引并不总是像所希望的那样准确,速度慢,而且根据我的观点,丑陋。您还可以使用函数,该函数同时为您提供一个包含索引和值的元组。