2014-09-05 2 views
0

기술적 배경 : Win XP 시스템에서 Python 3.4 + PyGame 1.9.2. 그것이 파이썬 사전의 작동 방식과 상관이 없다고 알고 보니Python 3/PyGame : 표면 참조/취급 (전 제목 : 복사 된 사전의 이상한 행동)

중요

원래 제목은 오해의 소지가 있었다! 단지 우연의 일치 그것은 사전으로 일어났습니다. 나는 문제를 빨리 설명하고 미래에 누군가에게 유용 할 수 있기를 바란다.

키와 내용물로 위치 튜플 (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의 단일 복사본을 나타냅니다. 말하자면 : 내가 사본 중 하나를 바꾼다면, 다른 모든 것은 똑같아 보이고, 실제로 복사하지는 않고, 단지 그것을 참조하십시오!

두 솔루션이 있습니다

  1. 는 각 상태에 대한 표면을 만들기 : "아직 클릭하지"에 대한 "클릭 였으나 놓친"에 대한 하나 하나가 "를 클릭하고 히트"에 대한 하나. 그런 다음 사전 키를 해당 표면으로 변경하십시오.

  2. 사전의 각 키에 대한 개별 서페이스를 만든 다음 개별 색으로 개별적으로 채 웁니다. 그것은 또한 작동합니다.

문제를 해결하려고 애쓰는 모든 사람에게 감사드립니다. 문제가 생겨서 죄송합니다. 완전히 다른 문제입니다. 제목과 키워드를 업데이트하여 향후 다른 사람에게 도움이되기를 바랍니다. 나는 오래된 질문 문안을 참조 용으로 남겼다. 그리고 그 다른 사전 질문에 대한 링크를 추가 한 사람 : 제거하십시오, 사전이 아니라 표면에 관한 것입니다, 감사합니다!



OLD 질문 텍스트

내 스크립트가 사전 반환하는 기능 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() 

통찰력을 주셔서 감사합니다!

+1

"수정"을 정의하십시오. –

+0

내 질문이 업데이트되었습니다. 지적 해 주셔서 감사합니다! –

답변

1

내가 단지 포인터를 복사 할 수 있도록 얕은 복사본을 만들 .copy 기억으로

dict2=copy.deepcopy(dict1); 

가 복사 라이브러리를

을 가져처럼 deepcopy 함수 것을 사용하려고 할 것입니다. 그래서 당신이 어떤 경우에 하나를 수정하면 복사본도 변경 될 것입니다.

+0

귀하의 노력 덕분에 오류가 발생한 곳을 찾을 수있었습니다! 나는 같은 질문을하는 다른 사람들을 위해 참고 문헌으로 다시 질문을 올렸다. 나는 이것을 인정 된 대답으로 만든다. 그것은 핵심을 정확하게 지적하지는 않지만 올바른 방향으로 나를 밀어 붙였습니다. 고마워요! 전체 이슈는 파이 게임이 표면을 어떻게 처리하는지와 관련이 있습니다. 더 자세한 정보는 업데이트 된 질문을 참조하십시오. –