2014-02-27 3 views
2

저는 deepcopy 함수와 복사 함수를 가지고 놀았으며 두 함수 모두에서 같은 문제가 발생합니다. 복사본이 적절한 복사본 대신 참조 (또는 포인터) 인 것처럼 보입니다. 파이썬에서 데이터 레코드 (클래스)로 작업 중입니다. 예를 보여 드리겠습니다 :Python copy.deepcopy() 함수가 제대로 작동하지 않습니다.

>>> import copy 
>>> class player1: 
... age = 23 
... score = 1 
>>> class player2: 
... age = 14 
... score = 2 
>>> player3 = copy.deepcopy(player1) 

저는 매개 변수를 인쇄합니다.

>>> print player1.age, player1.score 
23 1 
>>> print player2.age, player2.score 
14 2 
>>> print player3.age, player3.score 
23 1 

이제 player1 데이터 레코드의 점수 매개 변수가 증가합니다.

>>> player1.score += 3 

그리고 결과를 다시 인쇄합니다.

>>> print player1.age, player1.score 
23 4 
>>> print player2.age, player2.score 
14 2 
>>> print player3.age, player3.score 
23 4 

왜 플레이어 3이 변경 되었습니까? 방금 ​​player1이 아닌 player3의 매개 변수가 증가했습니다. 변경할 수없는 대신 변경할 수 있습니다.

미리 감사드립니다. documentation (강조 광산)에서

답변

3

:

모듈과 같은 유형을 복사하지 않습니다이 버전을 클래스, 기능, 방법, 이나 스택 추적, 스택 프레임 않으며, 파일, 소켓, 창, 배열이 아니며 과 유사한 유형이 아닙니다.

당신은 그래서 클래스를 복사하려고 노력하고있어 : 설계로

>>> player3 = copy.deepcopy(player1) 
>>> player1 is player3 
True 

하지만

>>> p1 = player1() 
>>> p2 = player2() 
>>> p3 = copy.deepcopy(p1) 
>>> p1 is p3 
False 
2

이 작동된다.

예제 코드에서는 개체 인스턴스가 아닌 클래스 정의를 복사하고 있습니다.

It does “copy” functions and classes (shallow and deeply), by returning the original object 
unchanged 

따라서 : copy 모듈 매뉴얼 페이지에서 당신은 클래스의 인스턴스를 복사 한 경우

player3 = player1 

그러나, 당신이 예상 결과를 얻을 것이다 :

player3 = copy.deepcopy(player1) 

은과 동일 :

player3 = copy.deepcopy(player1()) 
4

문제는 실제로 클래스 정의가 아니라 클래스 인스턴스를 복사하고 있다는 것입니다.

코드의 또 다른 문제점은 agescore이 클래스의 일부이며 해당 클래스의 모든 인스턴스간에 공유된다는 것입니다. 이것은 아마도 당신이 의도 한 것이 아닙니다.

당신이 아마하고 싶은 것은이 당신을 제공

import copy 
class Player: 
    def __init__(self, age, score): 
     self.age = age 
     self.score = score 

player1 = Player(23, 1) 
player2 = Player(14, 2) 
player3 = copy.deepcopy(player1) 

player1.age += 1 

print "player1.age", player1.age 
print "player3.age", player3.age 

당신은 무엇을 기대 :

player1.age 24 
player3.age 23 
+0

내가 나이와 점수 클래스 속성되었다는 사실이 관찰 된 행동에 대한 책임이 있음을 동의 ; 만약 player3이 정말로 다른 클래스라면, OP는이 문제를 가지고 있지 않았을 것입니다. 나는 그것들이 인스턴스 속성이어야한다고 동의하지만, 그것은 다른 것이다. – DSM

+0

@DSM : 예, 동의했습니다. 나는 처음에는 이것에 집착했다. 클래스 인스턴스가 전혀 없다는 것을 보지 못했다. 나는 이것을 바로 잡았다. –