Python - 更新类函数中的类自我字典

时间:2015-02-11 12:35:03

标签: python dictionary

我在类中有一个字典声明(self.d1)。 调用f1函数后,self.d1需要更新到f1

中的本地dict声明
import copy

class num:
    def __init__(self):
        self.d1 = {'a':1, 'b':2, 'c':3}
        self.f1(self.d1)

        print self.d1

    def f1(self,d):
        d2 = {'d':4, 'e':5, 'f':6}
        d = copy.deepcopy(d2)

test = num()

我希望输出为:

{'d':4, 'e':5, 'f':6}

但输出是

{'a':1, 'b':2, 'c':3}

我想了解问题所在而不仅仅是解决方案

4 个答案:

答案 0 :(得分:3)

您不希望在d中分配f1(),因为它会丢失self.d1的旧约束。因此,作业d只是f1()的本地变量。

但是你可以用这个来实现你想要的目标:

class num:
    def __init__(self):
        self.d1 = {'a':1, 'b':2, 'c':3}
        self.f1(self.d1)

        print self.d1

    def f1(self,d):
        d2 = {'d':4, 'e':5, 'f':6}
        d.clear()
        d.update(d2)

test = num()

<强>输出

{'e': 5, 'd': 4, 'f': 6}

请注意,我的代码未对d中的f1()进行任务,只会调用 mutate 现有对象。

进一步参考此&amp;相关主题,请参阅SO stalwart,Ned Batchelder的这篇优秀文章:Facts and myths about Python names and values

答案 1 :(得分:0)

你的问题在于

d = deepcopy(...)

你没有改变d引用的字典,你只需要改变d来引用另一个字典(在这种情况下,改为新创建的字典副本)。

答案 2 :(得分:0)

如果为某个变量{'a' : 1}分配值self.d1,那么该变量将保留对该值的引用。这意味着您可以通过访问d1来更改self.d1['a'] = 2的值,例如:{'a' : 2'},现在值为self.d1

您还可以通过将变量f1分配给新变量来更改变量d的引用。因此,在函数self.d1中,您实际上更改了{{1}}指向的引用,而不是它引用的值。由于函数的作用域,{{1}}仍然会在函数范围之外保留对原始值的引用。

答案 3 :(得分:0)

是另一种解释......

class num:

    def __init__(self):

        self.d1 = {'a':1, 'b':2, 'c':3}
        # calling a function with a dictionary copies the *reference* to the
        # dictionary object.

        print 'first test ..'
        self.test_dict_arg_1(self.d1)
        print self.d1

        print 'second test ...'
        self.test_dict_arg_2(self.d1)
        print self.d1

    def test_dict_arg_1(self, d):

        d2 = {'d':4, 'e':5, 'f':6}
        # now you load d with a new value, the referenced object is untouched
        d = d2

    def test_dict_arg_2(self, d):

        d2 = {'d':4, 'e':5, 'f':6}
        # now you work with the referenced object
        d.clear()
        d.update(d2)