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 微信会员卡等级和折扣规则
  • ¥15 微信公众平台自制会员卡可以通过收款码收款码收款进行自动积分吗
  • ¥15 随身WiFi网络灯亮但是没有网络,如何解决?
  • ¥15 gdf格式的脑电数据如何处理matlab
  • ¥20 重新写的代码替换了之后运行hbuliderx就这样了
  • ¥100 监控抖音用户作品更新可以微信公众号提醒
  • ¥15 UE5 如何可以不渲染HDRIBackdrop背景
  • ¥70 2048小游戏毕设项目
  • ¥20 mysql架构,按照姓名分表
  • ¥15 MATLAB实现区间[a,b]上的Gauss-Legendre积分