我遇到此数据结构的意外行为。
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'].append(new_year)
重复添加引用而不是新的 dict/object
,所以任何时候您进行更改实际上是在更改同一个对象。
您需要使用自己的代码深度复制
数据:
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
中的 instance attribute 而不是当前创建一次并共享的类属性在所有实例中:
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'}}]}
class vs instance attributes