リストの中に空のリストを作る方法

結論から。

# n is number of lists
lists = [ [] for i in xrange(n) ]

最初、

# Bad pattern
lists = [[]] * n

のように生成しようとしていたが、これには致命的な問題があった。

n = 3

a = [ [] for i in xrange(n) ]
b = [[]] * n

# 一見、両者は全く同じに見える
print a
# [[], [], []]
print b
# [[], [], []]
a == b
# True

#だがしかし
a[0].append('hoge')
b[0].append('fuga')

print a
# [['hoge'], [], []]
print b
# [['fuga'], ['fuga'], ['fuga']] ← !?

そう、[[]]に掛け算をする方式だと、
生成された空のリストの参照が全て同じになってしまうのだ。

n = 3

a = [ [] for i in xrange(n) ]
b = [[]] * n

print map(hex,map(id, a))
# ['0x2546c48L', '0x23fa608L', '0x2547708L']

print map(hex,map(id, b))
# ['0x248ddc8L', '0x248ddc8L', '0x248ddc8L']

ということで、真夏の終わりの怪奇現象に悩まされた思い出として久々の投稿でした。