Python二维列表赋值异常:修改单个元素致所有子列表同步变更
问题原因及解决方案
嘿,这个坑我刚入门Python的时候也踩过!咱们来一步步拆解为什么会出现这种情况:
为什么修改一个子列表会同步所有子列表?
你用Choises=[[False]*3]*101创建二维列表的时候,其实做了两件事:
- 首先创建了一个子列表
[False, False, False] - 然后把这个子列表的引用复制了101次,放进外层列表里
也就是说,Choises里的101个元素,全都是指向同一个内存地址的列表对象。你可以在交互环境里验证这一点:
>>> Choises=[[False]*3]*101 >>> id(Choises[0]) == id(Choises[1]) True
所以当你执行Choises[1][1]=True时,本质是修改了那个唯一的子列表的第二个元素,自然所有引用它的位置都会显示这个变化。
正确创建独立二维列表的方法
要让每个子列表都是独立的对象,你可以用列表推导式来创建:
Choises = [[False]*3 for _ in range(101)]
这个写法会循环101次,每次都新建一个[False]*3的子列表,所以每个子列表都有自己独立的内存空间。
你也可以用普通循环来实现同样的效果:
Choises = [] for _ in range(101): Choises.append([False]*3)
现在再测试修改操作:
>>> Choises[1][1] = True >>> Choises[0] [False, False, False] >>> Choises[1] [False, True, False]
这样就只会修改你指定的子列表啦,你的机器学习程序里的循环应该就能正常工作,不会出现所有值过快变成True的问题了。
内容的提问来源于stack exchange,提问作者Programmer S
相关产品推荐
相关产品推荐

