技术背景:Python3.4+ PyGame 1.9.2在Win XP系统上。
重要
原来的标题是误导的,因为事实证明,这与Python字典的工作方式无关!这只是巧合,它发生在一本字典里。我很快地解释了这个问题,希望它能对将来的人有所帮助。
有两个字典代表两个玩家的“棋盘”(这是一种像电脑游戏一样的战舰/海战),包含位置元组(x,y)作为键和表面作为键的内容。一些需要澄清的伪代码:
surface1 = pygame.Surface((w, h)).convert()
surface1.fill(WATER_COLOUR)
dict1 = {(x1, y1): surface1.copy(), (x2, y2): surface1.copy(), (x3, y3): surface1.copy()}
dict2 = dict1.copy()在游戏的过程中,玩家会点击显示,如果他们击中了一个有效的游戏场,该字段将改变它的颜色取决于一艘船是否被击中。
def clicked(mousepos, key):
if active_player == 1:
if mousepos_inside_enemy_ship_rectangle(mousepos):
dict1[position_of_mouse].fill((255, 0, 0)) # Make it red
else:
dict1[position_of_mouse].fill((0, 0, 0)) # Make it black令我惊讶的是,所有的正方形表面都会改变它们在两本字典中的颜色!我最初认为,这是字典中的一个问题,直到我发现,这是一个曲面如何在PyGame中工作的问题。
看起来,所有Sure1.Copy()都引用了surface1的一个副本。所以说:如果我换了一个拷贝,其他的看起来都一样,他们不是真的复制它,他们只是引用它!
有两种解决办法:
感谢所有试图解决这件事的人,并为这件事感到抱歉.这是完全不同的问题。我更新了标题和关键词,希望它能帮助其他人在未来。我把旧的问题课文留作参考。不管是谁把链接添加到另一个字典问题:请删除它,它不是关于字典,而是表面,谢谢!
拍拍
旧问题文本留待参考
我的脚本有一个函数f()返回一个字典:
def f(data):
d = {}
for n in range(len(data)):
d.update({n: data[n]})
return d我需要两个字典,从完全相同的数据开始,所以我可以用不同的方式修改这些数据。
dict1 = f(data)
dict2 = dict1.copy()令我惊讶的是,当我修改dict1时,dict2也会显示相同的更改!我以为这份文件将独立于原稿--我有误解什么吗?
这肯定与.copy()方法有关。当我像这样修改代码时:
dict1 = f(data)
dict2 = f(data)我收到的正是我想要的,我可以修改这两本词典,而不互相干涉。
这基本上解决了我的问题但也提出了一些问题..。我是否误解了.copy()的工作?在这个Python版本中,这是一个普遍的问题吗?
//编辑:
澄清我所说的“修改”是什么意思:
如果键满足某一条件,则更改dict1中的某些键的数据:
for key in dict1:
if key == meets_this_condition:
dict1[key] = new_data在另一种方法中,我经常比较这两本字典的内容,并根据它们的相同或不同调用某些函数。
for key in dict1:
if dict1[key] == dict2[key]:
do_something()
else:
do_something_else()谢谢你的见解!
拍拍
发布于 2014-09-06 00:04:16
我会尝试使用深度复制函数,类似于
dict2=copy.deepcopy(dict1);导入副本库
正如我所记得的,.copy做了一个浅拷贝,所以它只复制指针。因此,如果在某些情况下修改了一个副本,那么副本也会被更改。
https://stackoverflow.com/questions/25695521
复制相似问题