0

次の例を検討してください。

>>> result = [[]] * 8
>>> result
[[], [], [], [], [], [], [], []]
>>> result[0]
[]
>>> result[0].append("foo")
>>> result  # wtf? expected result: [['foo'], [], [], [], [], [], [], []]
[['foo'], ['foo'], ['foo'], ['foo'], ['foo'], ['foo'], ['foo'], ['foo']]

私はこれにひどく混乱しています。appendがどのように使用されることが期待されているのか理解できないかもしれません。iリスト内のネストされたリストにどのように追加しますか?

4

1 に答える 1

4

これは、次のようにするためです。

result = [[]] * 8

同じリストの8 つのコピーを作成します。コードは次のようになります。

>>> result = [[] for _ in xrange(8)]
>>> result
[[], [], [], [], [], [], [], []]
>>> result[0]
[]
>>> result[0].append("foo")
>>> result
[['foo'], [], [], [], [], [], [], []]
>>>

証拠として、次のことを考えてみてください。

>>> lst = [[]] * 2
>>> lst
[[], []]
>>> id(lst[0])
28406048
>>> id(lst[1])
28406048
>>>

リストの ID がここと同じであることに注意してください。

>>> lst = [[] for _ in xrange(2)]
>>> lst
[[], []]
>>> id(lst[0])
28408408
>>> id(lst[1])
28418096
>>>

それらは違う。

于 2013-10-17T15:14:51.897 に答える