首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python3/ PyGame:表面引用/处理(前标题:复制字典的奇怪行为)

Python3/ PyGame:表面引用/处理(前标题:复制字典的奇怪行为)
EN

Stack Overflow用户
提问于 2014-09-05 23:59:09
回答 1查看 89关注 0票数 0

技术背景:Python3.4+ PyGame 1.9.2在Win XP系统上。

重要

原来的标题是误导的,因为事实证明,这与Python字典的工作方式无关!这只是巧合,它发生在一本字典里。我很快地解释了这个问题,希望它能对将来的人有所帮助。

有两个字典代表两个玩家的“棋盘”(这是一种像电脑游戏一样的战舰/海战),包含位置元组(x,y)作为键和表面作为键的内容。一些需要澄清的伪代码:

代码语言:javascript
复制
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()

在游戏的过程中,玩家会点击显示,如果他们击中了一个有效的游戏场,该字段将改变它的颜色取决于一艘船是否被击中。

代码语言:javascript
复制
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的一个副本。所以说:如果我换了一个拷贝,其他的看起来都一样,他们不是真的复制它,他们只是引用它!

有两种解决办法:

  1. 为每个状态创建一个曲面:一个用于“尚未单击”,一个用于“单击但忽略”,另一个用于“单击并命中”。然后将字典键更改为相应的图面。
  2. 为字典中的每个键创建一个单独的图面,然后分别用各自的颜色填充它们。这也很管用。

感谢所有试图解决这件事的人,并为这件事感到抱歉.这是完全不同的问题。我更新了标题和关键词,希望它能帮助其他人在未来。我把旧的问题课文留作参考。不管是谁把链接添加到另一个字典问题:请删除它,它不是关于字典,而是表面,谢谢!

拍拍

旧问题文本留待参考

我的脚本有一个函数f()返回一个字典:

代码语言:javascript
复制
def f(data):
    d = {}
    for n in range(len(data)):
        d.update({n: data[n]})
    return d

我需要两个字典,从完全相同的数据开始,所以我可以用不同的方式修改这些数据。

代码语言:javascript
复制
dict1 = f(data)
dict2 = dict1.copy()

令我惊讶的是,当我修改dict1时,dict2也会显示相同的更改!我以为这份文件将独立于原稿--我有误解什么吗?

这肯定与.copy()方法有关。当我像这样修改代码时:

代码语言:javascript
复制
dict1 = f(data)
dict2 = f(data)

我收到的正是我想要的,我可以修改这两本词典,而不互相干涉。

这基本上解决了我的问题但也提出了一些问题..。我是否误解了.copy()的工作?在这个Python版本中,这是一个普遍的问题吗?

//编辑:

澄清我所说的“修改”是什么意思:

如果键满足某一条件,则更改dict1中的某些键的数据:

代码语言:javascript
复制
for key in dict1:
    if key == meets_this_condition:
        dict1[key] = new_data

在另一种方法中,我经常比较这两本字典的内容,并根据它们的相同或不同调用某些函数。

代码语言:javascript
复制
for key in dict1:
    if dict1[key] == dict2[key]:
        do_something()
    else:
        do_something_else()

谢谢你的见解!

拍拍

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-09-06 00:04:16

我会尝试使用深度复制函数,类似于

代码语言:javascript
复制
  dict2=copy.deepcopy(dict1);

导入副本库

正如我所记得的,.copy做了一个浅拷贝,所以它只复制指针。因此,如果在某些情况下修改了一个副本,那么副本也会被更改。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25695521

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档