作者changyuheng (张昱珩)
看板Python
标题[心得] 错误的 Multi-dimensinal list 初始化
时间Thu Feb 21 01:44:45 2013
今天犯了一个错误,跟大家分享:
初始化一 5 * 5 list 并设初始值为 0 的正确写法之一是:
l = [[0 for i in range(5)] for j in range(5)]
千万不可以写成:
l = [[0] * 5] * 5
--
UPD
说明如下:
-- the beginning of sample code --
a = [[
0] *
5] *
5
b = [[
0] *
5 for _
in xrange(
5)]
for i
in xrange(
5):
for j
in xrange(
5):
a[i][j] +=
1
b[i][j] +=
1
print 'a'
for i
in xrange(
5):
print ' '.join(
map(
str, a[i]))
print
print 'b'
for i
in xrange(
5):
print ' '.join(
map(
str, b[i]))
-- the end of sample code --
-- the beginning of output --
a
5 5 5 5 5
5 5 5 5 5
5 5 5 5 5
5 5 5 5 5
5 5 5 5 5
b
1 1 1 1 1
1 1 1 1 1
1 1 1 1 1
1 1 1 1 1
1 1 1 1 1
-- the end of output --
看起来是因为 a 里面装的 5 个 [0, 0, 0, 0, 0] 是一样的 instance,
会有这样的结果大概是因为
[[0] * 5] * 5
浅蓝色的部分是把黄色的部分的 pointer 复制 4 份
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 36.224.168.156
1F:推 ckclark:里面写[0] * 5是可以的 因为0是immutable 02/21 02:15
2F:推 ck574b027:下面多一个右括号 02/21 09:01
谢谢,已修正
※ 编辑: changyuheng 来自: 36.224.170.18 (02/21 10:07)