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 latex投稿显示click download
  • ¥15 请问读取环境变量文件失败是什么原因?
  • ¥15 在若依框架下实现人脸识别
  • ¥15 网络科学导论,网络控制
  • ¥100 安卓tv程序连接SQLSERVER2008问题
  • ¥15 利用Sentinel-2和Landsat8做一个水库的长时序NDVI的对比,为什么Snetinel-2计算的结果最小值特别小,而Lansat8就很平均
  • ¥15 metadata提取的PDF元数据,如何转换为一个Excel
  • ¥15 关于arduino编程toCharArray()函数的使用
  • ¥100 vc++混合CEF采用CLR方式编译报错
  • ¥15 coze 的插件输入飞书多维表格 app_token 后一直显示错误,如何解决?