如何在Python中初始化二维数组?

390 投票
31 回答
1147970 浏览
提问于 2025-04-15 20:07

我刚开始学习Python,想用一个二维列表,最开始我把每个位置都填上了同一个变量。我想出了这个方法:

def initialize_twodlist(foo):
    twod_list = []
    new = []
    for i in range (0, 10):
        for j in range (0, 10):
            new.append(foo)
        twod_list.append(new)
        new = []

这个方法能得到我想要的结果,但感觉有点绕。有没有更简单、更短、更优雅的方法呢?

31 个回答

273

你可以使用一种叫做 列表推导式 的方法:

x = [[foo for i in range(10)] for j in range(10)]
# x is now a 10x10 array of 'foo' (which can depend on i and j if you want)
593

在Python中,要初始化一个二维列表,可以使用

t = [ [0]*3 for i in range(3)]

但是不要使用 [[v]*n]*n,这会让你掉进一个陷阱里!

>>> a = [[0]*3]*3
>>> a
[[0, 0, 0], [0, 0, 0], [0, 0, 0]]
>>> a[0][0]=1
>>> a
[[1, 0, 0], [1, 0, 0], [1, 0, 0]]
418

在Python中,常常会出现这样一种写法:

bar = []
for item in some_iterable:
    bar.append(SOME EXPRESSION)

这促使了列表推导式的引入,它可以把上面的代码简化成:

bar = [SOME_EXPRESSION for item in some_iterable]

这样写更简洁,有时候也更容易理解。通常,你会逐渐习惯识别这种写法,并且经常用列表推导式来替代循环。

你的代码中就出现了这种模式两次:

twod_list = []                                       \                      
for i in range (0, 10):                               \
    new = []                  \ can be replaced        } this too
    for j in range (0, 10):    } with a list          /
        new.append(foo)       / comprehension        /
    twod_list.append(new)                           /

撰写回答