【问题标题】:Can a python dictionary be partially a reference to another dictionary and partially a copy?python字典可以部分是对另一个字典的引用,部分是副本吗?
【发布时间】:2021-09-02 07:35:37
【问题描述】:

如果我这样定义字典:

d1 = {'a': [1, 2], 'b': [3, 4]}
d2 = d1

那么d2是对d1的引用,如果我修改d2,那么d1也会被修改:

d2['b'] = [5, 6]
print(d1)         # {'a': [1, 2], 'b': [5, 6]}

如果我改为复制d1,则更改为d2 不会影响d1

d1 = {'a': [1, 2], 'b': [3, 4]}
d2 = d1.copy()
d2['b'] = [5, 6]
print(d1)         # {'a': [1, 2], 'b': [3, 4]}

问题

我可以让d2 部分作为参考(在a 中),部分作为d1 的副本(在b 中),以便我可以执行以下操作:

d1 = {'a': [1, 2], 'b': [3, 4]}
d2 = ???
d2['a'] = [5, 6]
d2['b'] = [7, 8]
print(d1)         # {'a': [5, 6], 'b': [3, 4]}

【问题讨论】:

  • 不是字面意思,不是。您需要将两个字典中的 a 键的值作为对您粘贴在两个字典中的可变对象的引用,然后再进行变异。
  • 否; d2 要么是 d1 的副本,要么不是。没有中间地带。
  • 另外,更准确的说法是d1d2都是同一个dict的引用; d1 是“真实”引用,d2 是“新”引用或对 name d1 的引用,这并没有真正的意义。
  • @user175348 你需要手动处理。 Python 没有为您提供管理它的方法。在字典之外创建对象,然后手动将其添加到两者中。
  • @user175348 mut = [3, 4]; d1['a'] = mut; d2['a'] = mut; mut[0] = 5; mut[1] = 6;

标签: python dictionary reference


【解决方案1】:

愿你的梦想成为现实。

class newdict(dict):
 def __init__(self,d,partially_a_reference_in=[]):
     self.update(d)
     self.partially_a_reference_in=partially_a_reference_in
     self.setitem=dict.__setitem__
 def __setitem__(self,x,i):
     if  x in self.partially_a_reference_in:
         self.setitem(self,x,i)
         #self.clear()
d1 = newdict({'a': [1, 2], 'b': [3, 4]},partially_a_reference_in=["a"])
d2=d1         
print(d2)
d2['a'] = [5, 6]
d2['b'] = [7, 8]
print(d1)  

【讨论】:

  • 我的梦想仍然是梦想...这里分配给 d2['b'] 对 d1 没有影响,但对 d2 本身也没有影响!
  • d2['b'] = [7, 8] print(d1) # {'a': [5, 6], 'b': [3, 4]} # 这个输出d1 表示 [7,8] 对 d1 没有影响
  • 是的,但它对 d2 也没有影响,当它应该更改 d2。
猜你喜欢
  • 2022-01-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-11
  • 1970-01-01
  • 1970-01-01
  • 2014-02-17
相关资源
最近更新 更多