0

これは私にとって落とし穴のようです、私はこれを理解できませんでした

>>> from collections import Counter
>>> tree = [Counter()]*3
>>> tree
[Counter(), Counter(), Counter()]
>>> tree[0][1]+=1
>>> tree
[Counter({1: 1}), Counter({1: 1}), Counter({1: 1})]

1 つのカウンターを更新するとすべてが更新されるのはなぜですか?

4

3 に答える 3

5

を使用する[x] * 3と、リストは同じ item( x) を 3 回参照します。

>>> from collections import Counter
>>> tree = [Counter()] * 3
>>> tree[0] is tree[1]
True
>>> tree[0] is tree[2]
True
>>> another_counter = Counter()
>>> tree[0] is another_counter
False

>>> for counter in tree: print id(counter)
...
40383192
40383192
40383192

Waleed Khan がコメントしたように、リスト内包表記を使用します。

>>> tree = [Counter() for _ in range(3)]
>>> tree[0] is tree[1]
False
>>> tree[0] is tree[2]
False

>>> for counter in tree: print id(counter)
...
40383800
40384104
40384408
于 2013-07-29T19:02:01.330 に答える
1

[Counter()]*3同じ Counterインスタンスを 3 回含むリストを生成します。使用できます

[Counter() for _ in xrange(3)]

3 つの独立したCounterのリストを作成します。

>>> from collections import Counter
>>> tree = [Counter() for _ in xrange(3)]
>>> tree[0][1] += 1
>>> tree
[Counter({1: 1}), Counter(), Counter()]

一般に、要素が変更可能なリストを乗算する場合は注意が必要です。

于 2013-07-29T19:02:32.647 に答える
1

tree = [Counter()]*31 つのカウンターとそれへの 3 つの参照を作成します。次のように記述できます。

c = Counter()
tree = [c, c, c]

3 つのカウンターが必要です。

>>> from collections import Counter
>>> tree = [Counter() for _ in range(3)]
>>> tree[0][1]+=1
>>> tree
[Counter({1: 1}), Counter(), Counter()]
>>> 
于 2013-07-29T19:02:53.517 に答える