有人可以解释一下,为什么self.C在执行后被撤回?
class Digits:
def __init__(self, A, B):
self.C = [0] * 10
self.A = [1 if digits == '1' else 0 for digits in bin(A)[2:]]
self.B = [1 if digits == '1' else 0 for digits in bin(B)[2:]]
def f(self):
C = [0] * 3
for i in range(3):
C[i] = self.A[i] + self.B[i]
buf = C
buf.reverse()
self.C = C
return buf
var = Digits(6,7)
var.f()
print var.A
print var.B
print var.C
我只是反转buf变量,而不是C,为什么var.C也反转了。对不起,我只是学习obj-orienting。 感谢。
答案 0 :(得分:1)
你真的只需要看一下这个序列:
buf = C
buf.reverse()
self.C = C
return buf
在第一行,您设置buf = C
。现在buf
和C
是同一个对象。如果您撤消buf
,则也会反转C
,因为它们是同一个对象。逆转后,你做self.C = C
。同样适用于此处 - 现在self.C
是buf
(C
)。最后,您返回buf
,但此时您已经重置self.C
。
请注意,在您的代码中,如果您写的内容如下:
x = var.f()
x[1] = 'Hello World!'
print var.C
您会在其中看到'Hello World!'
,因为从f
返回的值为 var.C
。
答案 1 :(得分:1)
让我们以图形方式解释原因。
这里A和Buf只是对相同内存位置的引用。
buf = C
以上将导致buf也指向相同的内存位置。他们之前的任何变化都将影响他们。对象的情况也是如此。 但是,在原始数据类型的情况下,这不成立。 例如。
a = 5
b = a
b += 3
这里a不会受b值变化的影响,因为这里a和b不包含内存位置的引用。他们持有实际数据