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 C#无selenium
  • ¥15 LD衰减计算的结果过大
  • ¥15 用机器学习方法帮助保险公司预测哪些是欺诈行为
  • ¥15 计算300m以内的LD衰减
  • ¥15 数据爬取,python
  • ¥15 怎么看 cst中一个面的功率分布图,请说明详细步骤。类似下图
  • ¥15 为什么我的pycharm无法用pyqt6的QtWebEngine
  • ¥15 FOR循环语句显示查询超过300S错误怎么办