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

Python Data Structure: Difference between two types of for-loop in python?

我原以为应该继续问这个问题,但不知怎么的我还是找不到(如果有,请在评论栏告诉我,我会删除这篇文章)

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

1
2
3
4
5
6
7
8
9
10
11
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控制流文档:https://docs.python.org/3/tutorial/control flow.html,但它并没有真正回答我的问题。


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


在第一个for循环中,"item"只是一个变量,它被分配给循环必须分配给的列表项。重新分配变量不会影响列表。在第二个循环中,您直接更改列表项,这就是在打印列表时显示列表项的原因。


有关第一个循环不工作的原因的示例,请检查:

1
2
3
4
5
6
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

以及一个与第二个循环等效的例子:

1
2
3
4
myList = ['a','b','c','d','e']
myList[0] = 's'

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

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

在第二个循环中,您将重新分配my_list的内容,因为您将第i个项目分配给该行的's'

1
    myList[i] = 's'

还可以考虑一个简单的例子:

1
2
3
4
    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

还可以看看这个:python:变量什么时候通过引用传递,什么时候通过值传递?