首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python32-D列表在Python 2中的中断

Python32-D列表在Python 2中的中断
EN

Stack Overflow用户
提问于 2022-07-21 11:59:00
回答 1查看 37关注 0票数 1

我正在尝试使用列表理解来初始化一个二维列表,但是我在Python 2和Python 3中看到了不同的结果,我不知道为什么。示例代码( import只是为了在v2中使用v3打印语句):

代码语言:javascript
复制
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] =...,它将按预期更新该元素。我在这里错过了什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-07-21 12:33:42

在相同的for循环中使用i两次,一次在列表理解中使用,一次作为外部for -循环的运行变量使用。正如this post中详细介绍的,列表理解中使用的变量“泄漏”到python2x中的周围范围。因此,您的for循环进程如下:

从for loop:

  • List解析式生成-1i=2

  1. Set i=0

  • myList[i] =实际上是myList[2] =

从for loop:

  • List解析式生成-1i=2

  1. Set i=1

  • myList[i] =实际上是myList[2] =

从for loop:

  • List解析式生成-1i=2

  1. Set i=2

  • myList[i] =实际上是myList[2] =

,它生成列表[0, 0, [-1, -1, -1]],因为我们只更改了myList[2]

最简单的解决方法是在一个地方使用不同的变量,即j:

代码语言:javascript
复制
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)
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73065769

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档