0
class A(object):
    aalist = []
    ai = 0
    def __init__(self):
    self.ablist = list()
    def add(self):
        self.aalist.append(["a","a"])
        self.ablist.append(["b","b"])
        self.ai = self.ai + 1
class B(A):
    def __init__(self):
        A.__init__(self)
        self.bblist = list()
    def badd(self):
        self.bblist.append(['c','c'])
for i in range(1,4):
    c = B()
    c.add()
    c.badd()
    print c.aalist,c.ablist,c.bblist,c.ai

これらのコードを実行すると、結果プロンプトが表示されます。

[['a', 'a']] [['b', 'b']] [['c', 'c']] 1
[['a', 'a'], ['a', 'a']] [['b', 'b']] [['c', 'c']] 1
[['a', 'a'], ['a', 'a'], ['a', 'a']] [['b', 'b']] [['c', 'c']] 1

intは静的に保たれているように見えるのに、リストがループで更新される理由がわかりません

4

1 に答える 1

2

You're doing completely different operations with them. Note that you assign a new integer to self.ai when you do self.ai = self.ai + 1. When you work with the list, you work on it in place using append. Also note that since you're working with an int (which is immutable), you can't change it's value in place.

There's also evidence that you're exploring class variables vs. instance variables here. Note that in your example, ablist and bblist are instance variable whereas aalist is a class variable. You can access them all the same way within a method (self.XXlist), but when you mutate self.aalist, you'll mutate the version on the class. In other words, self.aalist is A.aalist will return True. This allows all instances of your class to share the same list. When one updates the list, all the other instances will know immediately (unless they bind an instance level attribute with the same name -- That variable will then take precedence in the attribute lookup).

于 2012-10-25T14:37:37.120 に答える