【问题标题】:A nested list is changing its value without any intervention嵌套列表在没有任何干预的情况下更改其值
【发布时间】:2020-07-10 20:04:07
【问题描述】:

所以我创建了这个只有一个嵌套列表的类。据我说[[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知识?

【问题讨论】:

标签: python python-3.x variables nested variable-assignment


【解决方案1】:

我会稍微不同地定义a = [[1,1],[2,2],[3,3]]。比方说:

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

这和你的完全一样,我们只是给了内部列表名称,以便以后更容易理解。

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

 

好的,现在在self.a[0] = self.a[1]。 这一行的作用是对程序说:“将列表 a 的第一个元素与第二个元素相同”。 它确实复制第二个元素到第一个”。 区别在于self.a[0]self.a[1] 指向same 数组[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,所以self.a[1][0]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 中的数组不是包含数组的数组,它只是一个包含知道这些数组在哪里的变量(即指针或引用)的数组。

【讨论】:

  • 感谢您的详细解答。现在我明白了变量赋值是如何工作的。
猜你喜欢
  • 2018-05-24
  • 2021-11-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-16
  • 2012-01-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多