2013-07-14 2 views
-1

Я не понимаю вывод моего кода, показанного ниже. Я ожидаю увидеть:Перемещение переменных Python между объектами

1 
1 

, но вместо того, чтобы увидеть:

1 
2 

Это код в вопросе с помощью Python 2.7.3:

#!/usr/bin/python 

class Test: 
    __tBin = {'80':0, '70':0, '60':0, '50':0,'40':0, 
       '30':0, '20':0, '10':0, '0':0, 
       '-10':0, '-20':0, '-30':0, '-40':0} 

    def __init__(self): 
     self.__tests = {'i2c_transfer':self.__tBin} 

    def foo(self): 
     self.__tests['i2c_transfer']['80'] += 1 
     print self.__tests['i2c_transfer']['80'] 

if __name__ == "__main__": 
    testList = list() 
    for i in range(1, 3): 
     testList.append(Test()) 

    for i in testList: 
     i.foo() 

Благодарности

+2

Почему вы ожидаете этого? '__tBin' является атрибутом * class *, первый вызов' foo' изменяет его, и именно поэтому вы видите '2' второй раз. В вашем '__init__' похоже, что вы хотите сделать * копию *, но вы должны сделать это явно:' 'ic2_transfer ': self .__ tBin.copy()' – Bakuriu

+0

А, спасибо. Как я уже сказал ниже, это был мой первый опыт использования Python, и я предполагаю, что не смотрел документацию достаточно близко, поэтому я ожидал бы того, что думал. +1 – psidhu

ответ

2

При создании в словаре __tBin, вы на самом деле создаете его как Класс объект, а не как экземпляр объект. Поэтому, когда вы делаете self.__tests['i2c_transfer']['80'] += 1, это новое значение сохраняется в каждом экземпляре класса. Поэтому, если вы должны были изменить его на:

class Test: 
    def __init__(self): 
     self.__tBin = {'80':0, '70':0, '60':0, '50':0,'40':0, 
        '30':0, '20':0, '10':0, '0':0, 
        '-10':0, '-20':0, '-30':0, '-40':0} 
     self.__tests = {'i2c_transfer':self.__tBin} 

Вы должны получить то, что ищете. self .__ tBin создает экземпляр словаря как объекта экземпляра, и поэтому он будет сбрасываться каждый раз при создании экземпляра класса.

+0

Ах, спасибо, это мой первый раз, когда я использовал Python и никогда не понимал, что о dict's. – psidhu

+0

Счастливые помочь. Имейте в виду, что речь идет не о _dict_, а о классе. Когда вы создаете атрибуты без предшествующего, атрибут становится атрибутом класса. Поэтому в любое время, когда вы изменяете атрибут класса, эта модификация сохраняется во всех экземплярах класса, независимо от того, что это за атрибут. – pswaminathan

Смежные вопросы