-1

重複の可能性:
Python の「最小の驚き」: 可変デフォルト引数
Python リストの混乱

Python のリストのリストに少し困惑しています。次の 2 つのスニペットがあります。

li1 = [['a'], ['a'], ['a']]
print li1
for i in range(0, len(li1)):
    li1[i] += [i]
print li1

li2 = [['a']] * 3
print li2
for i in range(0, len(li2)):
    li2[i] += [i]
print li2

作成後、li1 と li2 は同じですが、要素を追加すると動作が異なります。

[['a'], ['a'], ['a']]
[['a', 0], ['a', 1], ['a', 2]]
[['a'], ['a'], ['a']]
[['a', 0, 1, 2], ['a', 0, 1, 2], ['a', 0, 1, 2]]

誰かがトリックがどこにあるか説明してもらえますか?

4

2 に答える 2

5

ではli2 = [['a']] * 3、3 つのリスト要素を持つ 1 つのリストを作成しますが、これらのリストは実際には同じオブジェクトです。つまり、 を変更するとli2[0]、 と も変更li2[1]されli2[2]ます。

次の行は、実際には 3 つの異なるリスト オブジェクトを含むリストを作成します。

li1 = [['a'], ['a'], ['a']]

この場合、変更するときli1[0]は、そのリストのみを変更します。他のリストは影響を受けません。li1これは、とで異なるリストを取得する理由を説明していますli2

于 2012-08-24T11:21:31.390 に答える
1

各要素の値を確認してくださいid()。これは、それらの動作の理由を明確に示唆しています。

>>> li1 = [['a'], ['a'], ['a']]
>>> for x in li1:                  #different id()
    id(x)


145497484
145514156
145511500

の同じ値id():

>>> li1=['a']*3
>>> for x in li1:
    print id(x)


3078093024
3078093024
3078093024
于 2012-08-24T11:28:05.207 に答える