libratonymb 2023-02-16 09:48 采纳率: 75%
浏览 29
已结题

这段python代码中用了字典的嵌套,为什么同一个变量输出结果会不一样?

这段python代码中用了字典的嵌套,为什么同一个变量输出结果会不一样?感觉第二个输出的结果里最后一组数值,把前面的数值都覆盖了。不知道是为什么。怎么样才能在第二个输出里得到每一组的正确数值。


class Backtest:
  def __init__(self, n) -> None:
    self.n:int =3
    self.atr_list:dict[str, dict]={}
    self.atrs:dict[str, dict]={}

  def run_testing(self):
      for product in ['apple','orange','banana','lemon']:
        self.sample_group(product,self.n)
        self.n += 1
      print("在结束遍历后的输出",self.atr_list)

  def sample_group(self, product, qty):
      for j in ['a','b','c','d','e','f',]:
        self.atrs[j]= qty/1317
      self.atr_list[product] = self.atrs
      print("在遍历中逐个水果输出结果",product, self.atrs)
      
if __name__ == "__main__":
  a=Backtest(10)
  a.run_testing()

在方法sample_group中每次输出的self.atrs是这样的:

img

但在run_testing 方法中输出的结果却是这样的:

img

  • 写回答

3条回答 默认 最新

  • 量化研究所 2023-02-16 09:52
    关注

    在这段代码中,同一个变量输出结果不同的原因是因为在sample_group函数中,将一个字典self.atrs赋值给了另一个字典self.atr_list[product]。在循环迭代过程中,每次对self.atrs进行修改时,实际上修改的是同一个字典对象的值。由于self.atr_list[product]实际上是指向同一个字典对象的引用,因此在循环结束后,self.atr_list中保存的是最后一次循环中self.atrs字典的值。

    如果要每次将self.atrs字典的副本保存到self.atr_list[product]中,可以使用copy方法:

    self.atr_list[product] = self.atrs.copy()
    

    这样每次将self.atrs的副本保存到self.atr_list[product]中,就不会出现同一个变量输出结果不同的情况了。

    有用望采纳。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 2月24日
  • 已采纳回答 2月16日
  • 修改了问题 2月16日
  • 创建了问题 2月16日

悬赏问题

  • ¥15 对于知识的学以致用的解释
  • ¥50 三种调度算法报错 有实例
  • ¥15 关于#python#的问题,请各位专家解答!
  • ¥200 询问:python实现大地主题正反算的程序设计,有偿
  • ¥15 smptlib使用465端口发送邮件失败
  • ¥200 总是报错,能帮助用python实现程序实现高斯正反算吗?有偿
  • ¥15 对于squad数据集的基于bert模型的微调
  • ¥15 为什么我运行这个网络会出现以下报错?CRNN神经网络
  • ¥20 steam下载游戏占用内存
  • ¥15 CST保存项目时失败