【问题标题】:Understanding objects in python (reverse function)理解python中的对象(反向函数)
【发布时间】:2014-06-17 03:27:08
【问题描述】:

谁能解释一下,为什么 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 也反转了。对不起,我刚刚学习面向对象。 谢谢。

【问题讨论】:

    标签: python arrays class object


    【解决方案1】:

    让我们以图形方式解释原因。

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

    buf = C
    

    上面会导致 buf 也指向相同的内存位置。因此,其中八分之一的任何变化都会影响两者。这在对象的情况下是正确的。 但是,对于原始数据类型,这不成立。 例如。

    a = 5
    b = a 
    b += 3
    

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

    【讨论】:

    • 谢谢。但是如何打印 var.C 和打印 f() 是彼此的反向数组?
    • 谢谢,终于成功了。但是现在看起来很脏,因为从 copy =(. 实现了 deepcopy
    • 另外,在不实现一些东西的情况下,我可以使用这样的数组:b = a[:]。这不会将两个变量链接到同一个对象。
    【解决方案2】:

    你真的只需要在这里看看这个序列:

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

    在第一行,您设置了buf = C。现在bufC 是同一个对象。如果你反转buf,你也反转C,因为它们是同一个对象。反转后,你做self.C = C。同样的事情也适用于这里——现在self.Cbuf(即C)。最后,您返回buf,但此时您已经重置了self.C

    请注意,如果您编写以下代码,请在代码中:

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

    你会在那里看到'Hello World!',因为从f返回的值是var.C

    【讨论】:

    • 也感谢您的解释:D
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-11-14
    • 1970-01-01
    • 2014-04-24
    • 2014-09-13
    • 1970-01-01
    • 2020-09-27
    相关资源
    最近更新 更多