1

私が達成しようとしているのは、小さな 2D リストを大きなリストに挿入することです (私は Python 2.7.3 を使用しています)。

var1とで異なる結果が得られるのはなぜvar2ですか?

def modify(foo):
    small = [[1]*2]*2
    for y, line in enumerate(small):
        foo[y+1][1:3] = line
    return foo

var1 = [[0]*4]*4
var2 = [
    [0, 0, 0, 0],
    [0, 0, 0, 0],
    [0, 0, 0, 0],
    [0, 0, 0, 0]]

print modify(var1)
print modify(var2)

# Result:
# var1 = [
#   [0, 1, 1, 0],
#   [0, 1, 1, 0],
#   [0, 1, 1, 0],
#   [0, 1, 1, 0]]
#
# var2 = [
#   [0, 0, 0, 0],
#   [0, 1, 1, 0],
#   [0, 1, 1, 0],
#   [0, 0, 0, 0]]
4

2 に答える 2

6

を使用[[0]*4]*4すると、実際には単一のリスト ( [0]*4) が作成され、それが 4 回参照されます。

>>> var1 = [[0]*4]*4
>>> var1
[[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]
>>> var1[0][0] = 2
>>> var1
[[2, 0, 0, 0], [2, 0, 0, 0], [2, 0, 0, 0], [2, 0, 0, 0]]
>>> var1[0] is var1[1]
True

内部コンテンツを変数に置き換えると、少しわかりやすくなります

>> inner = [0]*4
>> var1 = [inner, inner, inner, inner]
>>> var1
[[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]
>>> inner[0] = 1
>>> var1
[[1, 0, 0, 0], [1, 0, 0, 0], [1, 0, 0, 0], [1, 0, 0, 0]]
于 2013-04-11T19:20:54.823 に答える
2

[0]*4を作成しますが[0, 0, 0, 0][[0,0,0,0]]*4の浅いコピーを含むリストを作成します[0,0,0,0]。つまり、すべての内部リストは同じです。

于 2013-04-11T19:21:17.087 に答える