我正在尝试使用列表理解来初始化一个二维列表,但是我在Python 2和Python 3中看到了不同的结果,我不知道为什么。示例代码( import只是为了在v2中使用v3打印语句):
from __future__ import print_function
ROW = 3
COL = 3
myList = [0 for i in range(ROW)]
#print('myList1 =', myList, 'len =', len(myList))
for i in range(len(myList)):
#print('i =', i)
myList[i] = [-1 for i in range(COL)]
#myList[0] = [-1 for i in range(COL)]
print('myList2 =', myList)Python3输出:myList2 = [[-1, -1, -1], [-1, -1, -1], [-1, -1, -1]]
Python2输出:myList2 = [0, 0, [-1, -1, -1]]
Python3的行为正是我所期望的,注释掉的print语句是我用来确认两者之间的所有东西,直到myList[i]分配是相同的。如果我手动这样做,例如,在for循环之外的myList[0] =...,它将按预期更新该元素。我在这里错过了什么?
发布于 2022-07-21 12:33:42
在相同的for循环中使用i两次,一次在列表理解中使用,一次作为外部for -循环的运行变量使用。正如this post中详细介绍的,列表理解中使用的变量“泄漏”到python2x中的周围范围。因此,您的for循环进程如下:
从for loop:
-1和i=2的
i=0。myList[i] =实际上是myList[2] =从for loop:
-1和i=2的
i=1。myList[i] =实际上是myList[2] =从for loop:
-1和i=2的
i=2。myList[i] =实际上是myList[2] =,它生成列表[0, 0, [-1, -1, -1]],因为我们只更改了myList[2]。
最简单的解决方法是在一个地方使用不同的变量,即j:
from __future__ import print_function
ROW = 3
COL = 3
myList = [0 for i in range(ROW)]
for i in range(len(myList)):
#Use j for the list comprehension
myList[i] = [-1 for j in range(COL)]
print('myList2 =', myList)https://stackoverflow.com/questions/73065769
复制相似问题