嵌套列表在没有任何干预的情况下更改其值
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
部分:
- 通过调用
self.a[2]
我们访问数组 指针 d = [3,3]
- 按照这个逻辑,说
self.a[2][0]
等同于说 d[0]
- 因为我们增加了
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
中的数组不是一个包含数组的数组,它只是一个包含 知道这些数组在哪里的变量的数组(即指针或引用) .
所以我制作了这个 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
部分:
- 通过调用
self.a[2]
我们访问数组 指针d = [3,3]
- 按照这个逻辑,说
self.a[2][0]
等同于说d[0]
- 因为我们增加了
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
中的数组不是一个包含数组的数组,它只是一个包含 知道这些数组在哪里的变量的数组(即指针或引用) .