Переменная класса Python int vs array

Я играл с классами Python и пришел к следующему примеру, в котором две переменные, которые кажутся статическими переменными класса, при изменении изменяют свое поведение.

Что тут происходит? Мой первый инстинкт заключается в том, что со ссылками происходит что-то хитрое.

class Foo:
    a = []
    n = 0
    def bar(self):
            self.a.append('foo')
            self.n += 1

x = Foo()
print x.a, x.n    ([] 0)
x.bar()
print x.a, x.n    (['foo', 1])
y = Foo()
print y.a, y.n    (['foo', 0])
y.bar()
print y.a, y.n    (['foo', 'foo'], 1)
 qwwqwwq29 мая 2013 г., 07:04
вот аналогичный случай, чтобы высматривать в Pythonstackoverflow.com/questions/101268/...

Ответы на вопрос(1)

Решение Вопроса

Вы правы - в случаеFoo.a доступаself.a на самом деле доступFoo.a, который распределяется между всеми экземплярамиFoo, Однако при обновленииself.n с участием+= вы на самом деле создаете переменную уровня экземпляра наself эти тениFoo.n:

>>> import dis
>>> dis.dis(Foo.bar)
  5           0 LOAD_FAST                0 (self)
              3 LOAD_ATTR                0 (a)
              6 LOAD_ATTR                1 (append)
              9 LOAD_CONST               1 ('foo')
             12 CALL_FUNCTION            1
             15 POP_TOP             

  6          16 LOAD_FAST                0 (self)
             19 DUP_TOP             
             20 LOAD_ATTR                2 (n)
             23 LOAD_CONST               2 (1)
             26 INPLACE_ADD         
             27 ROT_TWO             
             28 STORE_ATTR               2 (n)
             31 LOAD_CONST               0 (None)
             34 RETURN_VALUE    

Другими словами, когда вы делаетеself.a.append('some value') переводчик выбираетa из памяти через имя наFoo а затем изменяет список, которыйFoo.a указывает на.

С другой стороны, когда вы делаетеself.n += 1 переводчик:

Fetchesn изFoo (потому что он не может найтиn наself)Создает новое значениеn + 1Сохраняет новое значение в атрибутеn наself
 mcamac29 мая 2013 г., 06:51
Попался. Задание, которое вызывает тень, было (для меня) скрыто за+=, Спасибо!

Ваш ответ на вопрос