for循环中列表修改的python行为

标签 python list for-loop int

为什么以下两个 for 循环在 list 上的行为不同?

在第一个示例中,我有一个intlist:修改for 循环中的每个元素并打印结果。然而,值的变化仅在循环范围内。

In [1]: my_list = [1,2,3,4,5,6,7,8,9,10]
In [2]: for e in my_list:
   ...:     e = e*2
   ...:     print e
   ...:     
Out [2]: 2
         4
         6
         8
         10
         12
         14
         16
         18
         20

In [3]: my_list
Out[3]: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

在第二个示例中,我有一个 listlist:修改 for 循环中的每个元素并打印结果。 然而,在这种情况下,值的变化被传递到循环范围之外。

In [4]: my_list = [[1,2],[3,4],[5,6],[7,8],[9,10]]
In [5]: for e in my_list:
   ...:     e[0] = e[0] + 1
   ...:     e[1] = e[1] + e[0]
   ...:     print e
   ...:     
Out [5]: [2, 4]
         [4, 8]
         [6, 12]
         [8, 16]
         [10, 20]
In [6]: my_list
Out[6]: [[2, 4], [4, 8], [6, 12], [8, 16], [10, 20]]

Why modifying an int is different from modifying a list entry (since it is also an int)?

最佳答案

通过执行 e[0] = e[0] + 1,您实际上是在修改列表 e 的第一个元素,即 中的第一个列表code>my_list 列表。您没有修改列表的引用my_list 仍然包含相同的列表对象(只是这些对象的内容已更改)。

另一方面,执行 e = e*2 不会修改 e,它会将 e 变量重新分配给一个新的整数,这是 e*2 表达式的结果。

为了更清楚,检查内置 id() 发生了什么功能:

>>> my_list = [1]  # shortened for the sake of example
>>> for e in my_list:
...     print 'BEFORE id(e)', id(e)
...     e = e*2
...     print 'AFTER id(e)', id(e)
... 
BEFORE id(e) 25364408
AFTER id(e) 25364384

您可以看到变量 e 已被重新分配给不同的对象。现在,如果您执行第二个示例中的操作:

>>> my_list = [[1,2]]
>>> for e in my_list:
...     print 'BEFORE id(e)', id(e)
...     e[0] = e[0] + 1
...     e[1] = e[1] + e[0]
...     print 'AFTER id(e)', id(e)
... 
BEFORE id(e) 140680995671144
AFTER id(e) 140680995671144
>>> id(my_list[0])
140680995671144

您看到您一直在对 ID 为 140680995671144 的同一对象进行操作,并且 my_list 仍然持有对该同一对象的引用,但它是已更改的对象内容。

关于for循环中列表修改的python行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32292952/

相关文章:

python - 在 python 中的 .txt 文件的新行中添加新列表

c - 如何在 C 中置换(洗牌)动态/链表

c - 我怎样才能在C中继续这个循环

xcode - For 循环中的 UITextView 缺少参数

python - 如何使用 python 获取两个日期时间(PDT 格式)之间的秒数差异?

python - 如何在Python中找到列表中相同的2个项目

Python 在同一目录中创建/导入自定义模块

python - Django REST 框架 JSONParser().parse(request) 引发错误

.net - Vb.net 两个逗号分隔的列表

c++ - for循环的简写——C++中的语法糖(11)