技术背景:Win XP 系统上的 Python 3.4 + PyGame 1.9.2。
重要的
原始标题具有误导性,因为事实证明这与 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 中表面如何工作的问题。
似乎所有的surface1.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()
感谢您的任何见解!
拍