Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 实例化类保留引用_Python_Class_Object_Reference - Fatal编程技术网

Python 实例化类保留引用

Python 实例化类保留引用,python,class,object,reference,Python,Class,Object,Reference,在Python中,我实例化了一个类两次,并将它们存储到两个不同的变量中。为什么第二个对象包含第一个对象的副本?我知道它是一个副本,因为我更改了一个对象中的值,而它不会更改另一个对象。例如: 我有以下课程: class HistoricalData: dataPoints = {} 然后我实例化该类并用值填充数据点: hd1 = HistoricalData() hd1.dataPoints["channel1"] = 1 hd1.dataPoints["channel2"] = 2 h

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

我有以下课程:

class HistoricalData:
    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中的值在第二个对象中更改,但在第一个对象中没有更改

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

您声明了a,而不是a

类变量在
类的所有实例中共享。这意味着当您更新一个
历史数据
对象
时,您将更新所有对象

实例变量是
类的每个实例的本地变量。它们通常在创建每个实例时调用的特殊方法中初始化

因此,您可能应该初始化
数据点
以获得所需的结果:

class HistoricalData(object):

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

如果我添加了一个具有简单类型(如字符串)的新实例变量,这也需要在init中定义吗?@DannyTsang:这与类型的简单性无关
self.name='
同样需要在
\uuuu init\uuuu()
(或类似文件)中进行初始化才能成为实例变量。@DannyTsang:很乐意提供帮助。欢迎来到StackOverflow社区!你在什么地方犯了个错误。JohnyWeb的答案是正确的,但如果运行上面的代码,您肯定会在
dataPoints
中看到两种情况下的值都更改为
10
。只有一本字典。“我知道这是一个副本,因为我改变了一个对象中的值,而它没有改变另一个。”--事实并非如此。