Oli*_*are 1 python dictionary pass-by-reference
我正在用 Python 编写一个脚本来模拟辩手锦标赛。但是我遇到了这个奇怪的错误,它看起来像是按引用传递问题,但有一些行为不应受到按引用传递的影响。
基本上,球队是球队的字典,其中每个球队都有一堆字段,包括胜利和失败字段,当我第一次建立球队时,这两个字段都被初始化为 0。
然后 df.apda_tournament() 接受团队字典,并根据模拟更改它以给出团队的胜利和失败,并返回更新的团队字典。
由于引用传递的工作原理,传递给 df.apda_tournament() 的球队字典和返回的字典最终都会被更改,因为该函数会更改传递字典中记录的获胜和失败并返回它。因此:
apda_results == apda_teams
Run Code Online (Sandbox Code Playgroud)
正如我所期望的那样返回 True。
奇怪的是 df.apda_tournament() 还改变了 apda_teams 是其副本的原始球队字典。所以最终结果是这样的:
apda_teams == teams
Run Code Online (Sandbox Code Playgroud)
也返回true。这很奇怪,因为当我声明它只是对团队的引用而不是副本时,它似乎是 apda_teams ,这是我没想到的,因为我在函数之外声明了它。
有人可以准确解释这里发生了什么吗?另外,我怎样才能避免这种情况,使 apda_teams 实际上是团队字典的唯一副本,而不仅仅是对内存中记录的引用?
下面附上代码:
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)
Run Code Online (Sandbox Code Playgroud)
运行它会返回:
Check this
True
True
Run Code Online (Sandbox Code Playgroud)
小智 7
在Python列表中,字典是可变的(我们可以修改内容)。因此,每当您将列表、字典传递给任何函数或分配给任何变量时,它都会指向给定变量的引用。
字符串、数字、元组是不可变的(我们不能修改内容)。因此,每当您将元组、数字字符串串到任何函数或分配给任何变量时,它都会复制该值。
归档时间: |
|
查看次数: |
6784 次 |
最近记录: |