我在类中有一个字典声明(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}
我想了解问题所在而不仅仅是解决方案
答案 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)