python3 では map() の結果が iterator になっているらしく、以下のように 2 回以上トラバースさせようとすると、2 回目以降が空になる。
def print_twice(X):
for i in range(2):
for x in X:
print(x)
X=(map(lambda x: x, range(2)))
print_twice(X)
0
1
list() でリスト化してやると良さそうだが、呼び出す側でリスト化するのは、呼び出される側の事をいちいち考えて呼ばないといけないのでなんか微妙
def print_twice(X):
for i in range(2):
for x in X:
print(x)
X=(map(lambda x: x, range(2)))
print_twice(list(X))
かと言って呼び出される側でリスト化すると今度は、オーバーヘッドが気になりそうな気も?
def print_twice(X):
X=list(X)
for i in range(2):
for x in X:
print(x)
X=(map(lambda x: x, range(2)))
print_twice(X)
どうするのが正解なんだろう?
参考:
- note.nkmk.me / 2016-03-21: Python3のmapはリストではなくイテレータを返す