Python 类中的嵌套词典
我遇到此数据结构的意外行为Python 类中的嵌套词典,python,dictionary,Python,Dictionary,我遇到此数据结构的意外行为 class IncomeVerification(object): data = {'IncomeYears': []} def __init__(self, income_years): for year in income_years: new_year = IncomeYear(year).data self.data['Incom
class IncomeVerification(object):
data = {'IncomeYears': []}
def __init__(self, income_years):
for year in income_years:
new_year = IncomeYear(year).data
self.data['IncomeYears'].append(new_year)
class IncomeYear(object):
data = {'IncomeYear': {'Year': None}}
def __init__(self, year, reported_income=None):
self.data['IncomeYear']['Year'] = year
income_years = ['2014', '2013', '2012', '2011']
foo = IncomeVerification(income_years)
print foo.data
这就回来了,
{'IncomeYears': [{'IncomeYear': {'Year': '2011'}}, {'IncomeYear': {'Year': '2011'}}, {'IncomeYear': {'Year': '2011'}}, {'IncomeYear': {'Year': '2011'}}]}
我期待着
{'IncomeYears': [{'IncomeYear': {'Year': '2014'}}, {'IncomeYear': {'Year': '2013'}}, {'IncomeYear': {'Year': '2012'}}, {'IncomeYear': {'Year': '2011'}}]}
我相信字典的嵌套特性会产生独特的关键问题,因此会覆盖现有条目。关于如何修改上面的调用以获得我想要的结果,有什么想法吗
谢谢。您正在使用
self.data['IncomeYears']反复添加引用,而不是新的dict/object
。在您自己的代码中追加(新的一年)
,因此无论何时进行更改,您实际上都在更改相同的对象
您需要使用自己的代码deepcopy
数据:
from copy import deepcopy
class IncomeVerification(object):
data = {'IncomeYears': []}
def __init__(self, income_years):
for year in income_years:
new_year = deepcopy(IncomeYear(year).data)
这将产生:
{'IncomeYears': [{'IncomeYear': {'Year': '2014'}}, {'IncomeYear': {'Year': '2013'}}, {'IncomeYear': {'Year': '2012'}}, {'IncomeYear': {'Year': '2011'}}]}
或者最好再次将data
作为IncomeYear
中的实例属性,而不是当前创建一次并在所有实例之间共享的类属性:
class IncomeVerification(object):
data = {'IncomeYears': []}
def __init__(self, income_years):
for year in income_years:
new_year = IncomeYear(year).data
self.data['IncomeYears'].append(new_year)
class IncomeYear(object):
def __init__(self, year, reported_income=None):
# new dict/object for each instance
self.data = {'IncomeYear': {'Year': None}}
self.data['IncomeYear']['Year'] = year
income_years = ['2014', '2013', '2012', '2011']
foo = IncomeVerification(income_years)
print(foo.data)
它再次输出:
{'IncomeYears': [{'IncomeYear': {'Year': '2014'}}, {'IncomeYear': {'Year': '2013'}}, {'IncomeYear': {'Year': '2012'}}, {'IncomeYear': {'Year': '2011'}}]}
发生这种情况是因为类中的
数据属性是类变量,它们的行为类似于其他编程语言中的静态属性,因为它们对于类是唯一的,而不是每个实例
要使代码正常工作,必须将它们移动到\uuu init\uuu()
方法中,使它们成为实例变量,如下所示:
class IncomeVerification(object):
def __init__(self, income_years):
self.data = {'IncomeYears': []}
for year in income_years:
new_year = IncomeYear(year).data
self.data['IncomeYears'].append(new_year)
class IncomeYear(object):
def __init__(self, year, reported_income=None):
self.data = {'IncomeYear': {'Year': None}}
self.data['IncomeYear']['Year'] = year
income_years = ['2014', '2013', '2012', '2011']
foo = IncomeVerification(income_years)
print foo.data
运行此命令将返回:
{'IncomeYears': [{'IncomeYear': {'Year': '2014'}}, {'IncomeYear': {'Year': '2013'}}, {'IncomeYear': {'Year': '2012'}}, {'IncomeYear': {'Year': '2011'}}]}
正如您所料。返回输出中的年份值均为2011年。在我的预期结果中,根据收入年数组的指数,它们是2014年、2013年、2012年和2011年。解释得很好,也很有效。谢谢。没问题,不用谢。