繁体   English   中英

Python Pass by Reference和字典副本

[英]Python Pass by Reference and dictionary copies

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

基本上,团队是团队的字典,其中每个团队都有一堆字段,其中包括获胜和失败字段,当我第一次建立团队时,这两个字段都被初始化为0。

然后df.apda_tournament()接收团队字典,并根据模拟对其进行更改以使团队获胜,并返回更新的团队字典。

由于按引用传递的工作方式,团队字典传递到df.apda_tournament()中,返回的一个字典最终都被更改,因为该函数会更改传递的字典中记录的得失并返回它。 从而:

apda_results == apda_teams

如我所料返回True。

奇怪的是df.apda_tournament()还会更改apda_teams是其副本的原始团队字典。 因此,最终结果是:

apda_teams == teams

也返回true。 奇怪的是,当我声明apda_teams只是对团队的引用而不是副本时,似乎是apda_teams,这是我所期望的,因为我在函数外部声明了它。

有人可以确切说明这里发生了什么吗? 另外,如何避免这种情况,使apda_teams实际上是team字典的唯一副本,而不仅仅是对内存中记录的引用?

以下是代码:

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

在python列表中,字典是可变的(我们可以修改内容)。 因此,无论何时将列表,字典传递给任何函数或分配给任何变量,都将指向给定变量的引用。

字符串,数字,元组是不可变的(我们无法修改内容)。 因此,只要您将元组字符串,为任何函数编号或分配给任何变量,则只需复制值即可。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM