首页 > 解决方案 > 列表值更改中的意外行为

问题描述

我定义了这个函数:

def newMap(dim, n):

    tc = [0 for i in range(n)]

    return [[tc for _ in range(dim)] for _ in range(dim)]

这会创建一个零列表列表。例如

m = newMap(2,2)
print(m)

返回

[[[0, 0], [0, 0]], [[0, 0], [0, 0]]]

我想改变一个操作系统来获得[[[0, 0], [0, 0]], [[0, 0], [0, 0]]]并尝试这样做

m[0][0][0] = 1

其中,意外返回[[[1, 0], [1, 0]], [[1, 0], [1, 0]]] 而不是[[[1, 0], [0, 0]], [[0, 0], [0, 0]]].

但是,如果我定义a = [[[0, 0], [0, 0]], [[0, 0], [0, 0]]], 然后做

a[0][0][0] = 1
print(a)

它返回[[[1, 0], [0, 0]], [[0, 0], [0, 0]]],这就是我想要的。

为什么会这样?这两个定义不应该是等价的吗?我怎样才能防止它在第一种情况下发生?

标签: python

解决方案


使用 tc.copy() 这应该可以解决它,我试过了,它可以工作:

def newMap(dim, n):

    tc = [0 for i in range(n)]

    return [[tc.copy() for _ in range(dim)] for _ in range(dim)]


a = newMap(2,2)  

a 
#[[[0, 0], [0, 0]], [[0, 0], [0, 0]]]

a[0][0][0] = 1
#[[[1, 0], [0, 0]], [[0, 0], [0, 0]]]

推荐阅读