怎么使用空值初始化嵌套列表,我可以将其追加到该列表中

本教程将介绍如何使用空值初始化嵌套列表,我可以将其追加到该列表中的处理方法,这篇教程是从别的地方看到的,然后加了一些国外程序员的疑问与解答,希望能对你有所帮助,好了,下面开始学习吧。

怎么使用空值初始化嵌套列表,我可以将其追加到该列表中 教程 第1张

问题描述

我正在学习蟒蛇,结果撞到了墙上。
我正在尝试定义一个2D列表,稍后我可以使用它来附加值。这与宽*高的网格相对应

我尝试使用[]来初始化空列表,但随后忽略了wid。
我尝试使用None作为占位符,但无法追加

wid = 3
hgt = 3
l1 = [[]*wid ] * hgt
l = [[None]*wid ] * hgt
l[1][1].append("something")

结果

l1: [[], [], []]

l: [[None, None, None], [None, None, None], [None, None, None]]

错误:

append: AttributeError: 'NoneType' object has no attribute 'append'

预期结果:[[[], [], []], [[], [], []], [[], [], []]]

推荐答案

尝试在列表理解中使用列表理解:

>>> [ [ [] for i in range(wid) ] for i in range(hgt) ]
[[[], [], []], [[], [], []], [[], [], []]]

注意:这比列表乘法更可取,因为这些列表中的每个列表都是唯一的。比较:

>>> x = [ [[] for i in range(wid)] for i in range(hgt) ]
>>> x[1][1].append('a')
>>> x
[[[], [], []], [[], ['a'], []], [[], [], []]]

>>> y = [ [[]] * wid for i in range(hgt) ]
>>> y[1][1].append('a')
>>> y
[[[], [], []], [['a'], ['a'], ['a']], [[], [], []]]

>>> z = [ [[]] * wid ] * hgt
>>> z[1][1].append('a')
>>> z
[[['a'], ['a'], ['a']], [['a'], ['a'], ['a']], [['a'], ['a'], ['a']]]

其中,在第二和第三种情况下,‘a’出现在多个单元格中!使用None并不能避免此问题:

>>> m = [ [None] * wid ] * hgt
>>> m
[[None, None, None], [None, None, None], [None, None, None]]
>>> if m[1][1] is None:
...  m[1][1] = ['a']
... else:
...  m[1][1].append('a')
...
>>> m
[[None, ['a'], None], [None, ['a'], None], [None, ['a'], None]]

tl;dr-使用双重列表理解。在我看来,无论怎么,这是最具可读性的选项。

好了关于怎么使用空值初始化嵌套列表,我可以将其追加到该列表中的教程就到这里就结束了,希望趣模板源码网找到的这篇技术文章能帮助到大家,更多技术教程可以在站内搜索。