Python 实例化类保留引用
在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
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
。只有一本字典。“我知道这是一个副本,因为我改变了一个对象中的值,而它没有改变另一个。”--事实并非如此。