嵌套列表在没有任何干预的情况下更改其值

A nested list is changing its value without any intervention

所以我制作了这个 class,它只有一个嵌套列表。根据我的说法 [[2,2],[3,3],[4,3]] 应该是输出。这就是项目分配在 python 中的工作方式。这是代码:

class A():
    def __init__(self):
        self.a = [[1,1],[2,2],[3,3]]
        self.start()

    def start(self):
        self.do()
        self.a[2][0] += 1
        print(self.a)

    def do(self):
        self.a[0] = self.a[1]
        self.a[1] = self.a[2]

aaa = A()

但是输出结果是[[2,2],[4,3],[4,3]]。对于最后一个列表,第二个列表不知何故也发生了变化。这发生在代码的第 8 行。

请告诉我哪里出了问题,输出还是我的python知识?

我对 a = [[1,1],[2,2],[3,3]] 的定义略有不同。比方说:

b = [1,1]
c = [2,2]
d = [3,3]
a = [b,c,d]

这与您拥有的完全相同,我们只是给出了内部列表的名称,以便以后更容易理解。

人们可能会称这些名称为引用,或指向内存位置的指针。如果您不熟悉这些术语,一种查看方式是 "b 不包含 [1,1],它只知道它在程序内存中的位置"[=69] =].

好的,现在 self.a[0] = self.a[1]。 这行代码对程序说:"assign the first element of list a to be the same as the second one"。 它不是"将第二个元素复制到第一个"。 不同的是self.a[0]self.a[1]指向相同的数组[2,2]。换句话说 a = [c,c,d] 现在。

self.a[1] = self.a[2] 做同样的事情,但是针对不同的元素,所以 a = [c, d, d]。 到目前为止,一切都如你所料。 打印时数组等于 [[2,2],[3,3],[3,3]],但问题是这里的 [3,3] 是同一个数组,它只能被 self.a.

的两个元素访问

现在让我们逐步处理 self.a[2][0] += 1 部分:

  1. 通过调用 self.a[2] 我们访问数组 指针 d = [3,3]
  2. 按照这个逻辑,说 self.a[2][0] 等同于说 d[0]
  3. 因为我们增加了d[0],并且self.a[1]self[2]都增加到d,[=34] =] 和 self.a[2][0] 已更改。

另一种看待它的方式是您的代码等同于:

class A():
    def __init__(self):
        self.b = [1,1]
        self.c = [2,2]
        self.d = [3,3]
        self.a = [self.b, self.c, self.d]
        self.a[0] = self.c
        self.a[1] = self.d
        self.d[0] += 1
        print(self.a)

aaa = A()

self.a 中的数组不是一个包含数组的数组,它只是一个包含 知道这些数组在哪里的变量的数组(即指针或引用) .