在函数中设置实例成员-这是怎么回事?

时间:2019-02-07 15:48:10

标签: python-3.x

考虑以下代码test_class.py:

class TestClass:
    def __init__(self,Na,Nb):
        self.a = list(range(Na))
        self.b = list(range(Nb))

    def swapA(self):
        a = self.a
        b = self.b
        a,b = b,a
        assert a is self.b
        assert b is self.a

    def swapB(self):
        a = self.a
        b = self.b
        a,b = b,a
        assert a is self.b
        assert b is self.a

        #why is this necessary?
        self.a = a
        self.b = b

if __name__ == '__main__':
    tc = TestClass(2,3)
    print('len(tc.a) = %d, len(tc.b) = %d' % (len(tc.a),len(tc.b)))
    tc.swapA()
    print('after swapA(): len(tc.a) = %d, len(tc.b) = %d' % (len(tc.a),len(tc.b)))
    tc.swapB()
    print('after swapB(): len(tc.a) = %d, len(tc.b) = %d' % (len(tc.a),len(tc.b)))

通过运行此(python test_class.py)得到的输出是:

len(tc.a) = 2, len(tc.b) = 3
after swapA(): len(tc.a) = 2, len(tc.b) = 3
after swapB(): len(tc.a) = 3, len(tc.b) = 2

我不明白为什么swapA()并没有像我期望的那样更新self.aself.b成员。尽管断言通过了。我希望swapA()swapB()的行为是相同的,但事实显然并非如此。

这里的任何解释将不胜感激。

0 个答案:

没有答案