我正在用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