Python-二维数组地址填充了整个数组

时间:2019-03-02 13:17:41

标签: python arrays

我有问题。首先让我向您展示代码:

def neon(l):
    oc = 0; #naj ocena
    tz = 0; #teraz ocena

    #sprawdzanie poziomo
    for x in range(len(l[0])):
        for i in range(len(l[x])):
            for y in range(i + 1,len(l[x])):
                tz = l[x][i] + l[x][y] + (max(y - x, x - y) + 1) * 2;
                if (tz > oc):
                    oc = tz;

    pion = [[0] * len(l[0])] * len(l);

    print(pion);
    print("#######");

    for i in range(len(pion)):
        for y in range(len(pion[i])):
            pion[i][y] = l[y][i];

        print(pion);

neon([[1,2,1,2],[7,1,7,1],[1,1,1,1],[3,3,3,3]]);

问题在于,当我尝试处理pion[i][y]而不是仅仅将该值从0更改为任何值时,程序将使用第二个索引y更改所有内部数组中的值。看起来是这样:

[[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]
#######
[[1, 7, 1, 3], [1, 7, 1, 3], [1, 7, 1, 3], [1, 7, 1, 3]]
[[2, 1, 1, 3], [2, 1, 1, 3], [2, 1, 1, 3], [2, 1, 1, 3]]
[[1, 7, 1, 3], [1, 7, 1, 3], [1, 7, 1, 3], [1, 7, 1, 3]]
[[2, 1, 1, 3], [2, 1, 1, 3], [2, 1, 1, 3], [2, 1, 1, 3]]

它应该是:

[[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]
#######
[[1, 7, 1, 3], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]
[[1, 7, 1, 3], [2, 1, 1, 3], [0, 0, 0, 0], [0, 0, 0, 0]]
[[1, 7, 1, 3], [2, 1, 1, 3], [1, 7, 1, 3], [0, 0, 0, 0]]
[[1, 7, 1, 3], [2, 1, 1, 3], [1, 7, 1, 3], [2, 1, 1, 3]]

请帮助并提前谢谢您。

1 个答案:

答案 0 :(得分:1)

由于以下原因而发生此问题:

  1. pion是内部列表的列表。 pion的每个元素仅保留对一个内部列表的引用。
  2. 由于创建和初始化pion(使用pion = [[0] * len(l[0])] * len(l)的方式),pion的所有元素都将引用保留到同一内部列表。因此,在pion中,您没有多个不同的内部列表,而只对一个内部列表具有多个引用。换句话说,pion[0]pion[1]pion[2]等都是对相同的内部零列表的引用。您使用特定行索引(例如,使用表达式pion[3])对此内部列表所做的任何修改,也将在所有其他行索引中可见,因为在所有行索引中,您只是保持对相同内部列表的引用。

要纠正此问题,您需要以其他方式创建和初始化列表。例如,如果rowscols分别是行数和列数,则可以执行以下操作:

pion = [([0]*cols) for i in range(rows)]