Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/291.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_Dictionary - Fatal编程技术网

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年。解释得很好,也很有效。谢谢。没问题,不用谢。