2

非常に単純なコードのネストされた例:

コードが行うのは、ゼロに初期化されたリストのリストを作成することだけです。リストの行と列を反復処理し、各位置に値が与えられます。何らかの理由で、最終的なベクトルが出力されるときに、2D リストの最後の行が行ごとに複製されます。

Number_of_channels=2
Coefficients_per_channel=3

coefficient_array=[[0]*Coefficients_per_channel]*Number_of_channels 
print coefficient_array

for channel in range(Number_of_channels):
    for coeff in range(Coefficients_per_channel):
        coefficient_array[channel][coeff]=coeff*channel
        print coefficient_array[channel][coeff]

print coefficient_array

出力:

[[0, 0, 0], [0, 0, 0]]
0
0
0
0
1
2
[[0, 1, 2], [0, 1, 2]]

私は実際に期待しています:

[[0, 0, 0], [0, 1, 2]]

なぜこれが起こっているのか誰にも分かりますか?

4

3 に答える 3

5

外側のリストを複製するだけですが、そのリストの値は変更されません。したがって、すべての (両方の) 外側のリストには、同じ内側の変更可能なリストへの参照が含まれます。

>>> example = [[1, 2, 3]]
>>> example *= 2
>>> example
[[1, 2, 3], [1, 2, 3]]
>>> example[0][0] = 5
[[5, 2, 3], [5, 2, 3]]
>>> example[0] is example[1]
True

ループ内で内側のリストをより適切に作成します。

coefficient_array=[[0]*Coefficients_per_channel for i in xrange(Number_of_channels)]

または、再び python プロンプトで示されます。

>>> example = [[i, i, i] for i in xrange(2)]
>>> example
[[0, 0, 0], [1, 1, 1]]
>>> example[0][0] = 5
>>> example
[[5, 0, 0], [1, 1, 1]]
>>> example[0] is example[1]
False
于 2012-05-31T09:26:51.213 に答える
1

With

coefficient_array=[[0]*Coefficients_per_channel]*Number_of_channels

you do a duplication of references to the same object:

coefficient_array[0] is coefficient_array[1]

evaluates to True.

Instead, build your array with

[[coeff*channel for coeff in range(Coefficients_per_channel)] for channel in range(Number_of_channels)]
于 2012-05-31T09:39:53.423 に答える
0

代わりにこれを試してください:

coefficient_array=[0]*Number_of_channels 
print coefficient_array

for channel in range(Number_of_channels):
    coefficient_array[channel] = [0] * Coefficients_per_channel
    for coeff in range(Coefficients_per_channel):
        coefficient_array[channel][coeff]=coeff*channel
        print (channel, coeff)
        print coefficient_array[channel][coeff]

print coefficient_array
于 2012-05-31T09:31:08.213 に答える