代码之家  ›  专栏  ›  技术社区  ›  Oliver Hare

Python按引用传递和字典副本

  •  0
  • Oliver Hare  · 技术社区  · 7 年前

    我正在用Python编写一个脚本来模拟辩论赛。但我遇到了这个奇怪的错误,它看起来像是一个通过引用的问题,但有一些行为不应该受到通过引用的影响。

    基本上,团队是一个团队字典,其中每个团队都有一系列字段,包括一个赢和输字段,当我第一次构建团队时,这两个字段都初始化为0。

    然后是df。apda_tournament()接受一个团队字典,并对其进行修改,以根据模拟给出团队的胜负,然后返回更新后的团队字典。

    由于通过引用传递的工作方式,团队字典传递到了df中。apda_tournament()和返回的结果都被更改,因为该函数更改了传递的字典中记录的胜负并返回它。因此:

    apda_results == apda_teams
    

    正如我所料,返回True。

    奇怪的是df。apda_tournament()还更改了apda_teams是其副本的原始团队词典。结果是:

    apda_teams == teams
    

    也返回true。这很奇怪,因为当我声明它只是对团队的引用而不是副本时,似乎是apda_团队,这是我不希望看到的,因为我在函数之外声明了它。

    有人能解释一下这里到底发生了什么吗?此外,我如何避免这种情况,使apda_团队实际上是团队词典的唯一副本,而不仅仅是对内存中记录的引用?

    以下是代码:

    import debate_functions as df
    
    dbtr_num = 64
    team_num = dbtr_num / 2
    dbtr_mn_mn = 200
    dbtr_mn_std = 80
    dbtr_std_mn = 80
    dbtr_std_std = 60
    judge_bias = 70
    
    dbtrs = df.make_debaters(dbtr_num, dbtr_mn_mn, dbtr_mn_std, dbtr_std_mn, dbtr_std_std)
    teams = df.make_teams(dbtrs, dbtr_mn_mn, dbtr_mn_std)
    print(teams)
    apda_teams = teams
    para_teams = teams
    
    apda_results = df.apda_tournament(5, apda_teams, judge_bias)
    print('Check this')
    print(apda_results == apda_teams)
    print(apda_teams == teams)
    

    Check this
    True
    True
    
    1 回复  |  直到 7 年前
        1
  •  5
  •   Satish Chauhan    7 年前

    在python列表中,字典是可变的(我们可以修改内容)。所以,每当你们把列表、字典传递给任何函数或赋值给任何变量时,它都指向给定变量的引用。

    字符串、数字、元组是不可变的(我们不能修改内容)。因此,无论何时,只要您对元组进行字符串处理,对任何函数进行编号或对任何变量赋值,它都只需复制值。