理解python中的对象(反向函数)

时间:2014-06-17 03:27:09

标签: python arrays class object

有人可以解释一下,为什么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。 感谢。

2 个答案:

答案 0 :(得分:1)

你真的只需要看一下这个序列:

            buf = C
            buf.reverse()
            self.C = C
            return buf

在第一行,您设置buf = C。现在bufC 是同一个对象。如果您撤消buf,则也会反转C,因为它们是同一个对象。逆转后,你做self.C = C。同样适用于此处 - 现在self.CbufC)。最后,您返回buf,但此时您已经重置self.C

请注意,在您的代码中,如果您写的内容如下:

x = var.f()
x[1] = 'Hello World!'
print var.C

您会在其中看到'Hello World!',因为从f 返回的值为 var.C

答案 1 :(得分:1)

让我们以图形方式解释原因。 enter image description here

这里A和Buf只是对相同内存位置的引用。

buf = C

以上将导致buf也指向相同的内存位置。他们之前的任何变化都将影响他们。对象的情况也是如此。 但是,在原始数据类型的情况下,这不成立。 例如。

a = 5
b = a 
b += 3

这里a不会受b值变化的影响,因为这里a和b不包含内存位置的引用。他们持有实际数据