实例化类保留引用

时间:2011-10-23 09:56:38

标签: python class object reference

在Python中,我实例化一个类两次并将它们存储到2个不同的变量中。为什么第二个对象包含第一个对象的副本?我知道这是一个副本,因为我更改了一个对象中的值而它没有改变另一个对象。例如:

我有以下课程:

class HistoricalData:
    dataPoints = {}

然后我实例化该类并使用值填充dataPoints:

hd1 = HistoricalData()
hd1.dataPoints["channel1"] = 1
hd1.dataPoints["channel2"] = 2
hd1.dataPoints["channel3"] = 3

然后我再次实例化该类并再次使用值填充它:

hd2 = HistoricalData()
hd2.dataPoints["channel1"] = 10

当我从hd1.dataPoints和hd2.dataPoints打印值时,我得到以下内容:

{'channel1': 1, 'channel2': 2, 'channel3': 3}
{'channel1': 10, 'channel2': 2, 'channel3': 3}

字典有第二个对象中第一个的副本,因为channel1中的值在第二个中更改但不是第一个。

我想当你实例化一个类时,所有的值都将默认为类中定义的值。我错过了什么吗?

1 个答案:

答案 0 :(得分:10)

您已声明class variable,而不是instance variable

类变量在class所有实例之间共享。这意味着当您更新一个HistoricalData object时,您将全部更新。

实例变量是 class的每个实例的本地变量。这些通常在__init__()特殊方法中初始化,该方法在创建每个实例时调用。

因此你应该像这样初始化datapoints以获得你想要的结果:

class HistoricalData(object):

    def __init__(self):
        self.dataPoints = {}