2012-11-14 3 views
1

예기치 않은 문제가 발생했을 때 파이썬에서 어떤 작업을하고있었습니다. 나는 클래스와 두 개의 변수 x와 y를 가지고있다. x와 y는 각각 자신의 데이터가있는 클래스의 별도 사본이됩니다. 그래서 x를 클래스와 같게 설정하고 몇 가지 값을주고 y를 사용하여 동일하게합니다. 일단 그 데이터를 사용하려고하면 x에 대한 값을 덮어 썼다는 것을 알게됩니다. 두 클래스의 별도 복사본을 만들지는 않았지만 대신 같은 클래스에 대한 두 개의 참조를 작성한 것으로 보입니다. 그래서 여기 코드의 일반적인 예는 다음과 같습니다왜 두 개의 클래스 인스턴스가 동일한 데이터를 공유하는 것으로 보입니까?

x = someClass() 
x.set(2, 0) 
y = someClass() 
y.set(3, 0) 
print(x) 

최종 결과는 3 대신 나는 각 변수에 대해 서로 다른 데이터를 보유 할 클래스의 별도의 "버전"을 만들려면 2의 인쇄되어 있다는 점이다. 그러나 어떻게에 관해서는. 파이썬 사용하기 3.3. 다음은 클래스 코드입니다.

class someClass: 
    def __init__(self, list = [0,0,0,0,0,0,0,0,0,0]): 
     self.list = list 
    def __repr__(self): 
     return str(self.list) 
    def set(self, loc, val): 
     if ((loc >= 0) & (loc <= 9)): 
      self.list[loc] = val 
+1

문제가 클래스 정의에있는 것 같습니다. 게시 할 수 있습니까? –

+2

클래스와 개체를 혼동스럽게합니다. 'someClass()'를 호출하면 그 클래스의 인스턴스를 생성하게됩니다. 그 인스턴스는 그 자체로는 클래스가 아닙니다. '다른 데이터를 담을 수있는 별도의 "버전"을 만들고 싶습니다.'라는 용어는 독립적 인 클래스 인스턴스를 만들고 싶다는 의미였습니다. 당신은 가지고 있습니다. 하지만 어떻게 든 데이터를 서로 연결했습니다. 그 외에도 일부 예제 코드를 보지 않고는 도움을 받기가 어렵습니다. – Iguananaut

+0

'someClass','__init__'과'set' 메쏘드의 정의가 없다면이 질문은 대답 할 수 없습니다. – msw

답변

5

당신은 파이썬에 대한 일반적인 초보자 함정에 빠졌습니다. def __init__(self, list = [0,0,0,0,0,0,0,0,0,0])과 같이 목록을 기본 변수로 사용하면 해당 클래스의 모든 인스턴스가 해당 인수의 값과 동일한 목록 인스턴스를 공유 함을 의미합니다. 또한 "Least Astonishment" and the Mutable Default Argument

그러나 목록과 같은 컨테이너 객체를 기본 인수로 사용하려는 경우 공통적 인 관용구는 None을 대신 사용하여 확인하는 것입니다. 예 :

def __init__(self, values=None): 
    if values is None: 
     values = [0] * 10 

또는 무엇이든. 분명히 기본 논증으로 스스로 문서화하지는 않지만 작동합니다.

부수적으로 list을 변수 이름으로 사용하지 마십시오. (다소 일반적으로 사용되는) list 내장 문자를 음영 처리합니다.

+0

그게 이상하고 예기치 않은 대답입니다. 내가 아는 어떤 것이 아니 었습니다. 도와 주셔서 감사합니다. –

+0

내가 선호하는 접근법은 기본 인수가 'tuple'과 같이 불변 인 것입니다. 속성을'list (values)'로 저장하면된다. 이것은 사용자가 생성자 (generator)를 전달할 수있는 장점이 있으며, 인스턴스는 여전히 색인을 생성 할 수있는 목록을 수신하고 스플 라이스 (splice) 등의 기능을 수행합니다. 전달 된 목록이 복사되어 "보호합니다" 입력에 따라 다르지만 수행중인 작업에 따라 쓸모없는 성능 저하가 발생할 수 있습니다. –

+0

"특별한 경우가 특별하지 않기"때문에이 방법을 선호합니다. 그렇게 할 수있는 간단한 방법이있을 때마다 조건부 논리를 피하기를 좋아합니다. –

관련 문제