2012-03-02 4 views
1

내가이 예상되는 동작을 생각하지만, 확인하고 내가 수행 한 연구가 빈 도달했습니다 같은 이유, 어쩌면 발견 할 객체파이썬 피클 : 절인 객체가 소스에 동일하지가

내가 끌어 당기는 기능이 데이터를 만들고 사용자 정의 클래스의 새 인스턴스를 만든 다음 목록에 추가합니다. 클래스에는 변수 만 포함됩니다.

필자는 프로토콜 2를 바이너리로 사용하여 파일 목록을 피클링 한 다음 나중에 스크립트를 다시 실행하고 원본에서 데이터를 다시 가져오고 사용자 정의 클래스 인스턴스를 사용하여 새 목록을 유지합니다. 데이터는 소스 데이터와 동일합니다. 내가 할 때

지금 피클 파일

새로 고침 :

print source_list == pickle_list 

을이 항상 다시 False 온다, 나는 아무 생각이 왜, 나는 목록을 인쇄하거나 보는 구조를 보면 정확히 같은.

어떤 아이디어라도 멋지다. 이것은 내가 마지막으로 정렬해야하는 나의 마지막 조금이다.

답변

1

동일한 클래스의 두 객체를 비교하면 동일한 내용을 가지고 있더라도 기본적으로 False가 반환됩니다 (동일한 단일 객체가 아닌 한). 즉, 동일한 클래스의 두 직관적으로 "동일한"객체는 기본적으로 서로 다른 것으로 간주됩니다. 다음은 예입니다

가 동일한 데이터를 포함하는 개체에 대한 진정한 얻을 수 있도록 사용자 정의 클래스에서 __eq__() (및 __ne__())를 정의 할
>>> class C(object): 
...  def __init__(self, value): 
...   self.value = value 
...   
>>> 
>>> C(12) == C(12) 
False 

. 자세한 내용은 official documentation에서 확인할 수 있습니다. 위의 예를 들어,이는 다음과 같습니다

>>> class C(object): 
...  # ... 
...  def __eq__(self, other): 
...   return self.value == other.value 
...  def __ne__(self, other): 
...   return not self == other # More general than self.value != other.value 
...  
>>> C(12) == C(12) # __eq__() is called 
True 
>>> C(12) != C(12) # __ne__() is called 
False 
+0

안녕하세요, 예를 들어 주셔서 감사합니다. __ne__ 부분을 놓쳤습니다. 좋은 예 – Richard

3

수업 가능성이 의미있는 __eq__ 정의하지 않으며, 따라서 개체의 정체성에 대한 비교되고있다. 피클에서로드 된 클래스는 생성 된 목록의 클래스와 동일한 객체가 아니기 때문에 (동일한 데이터를 가지고 있음에도) False이됩니다.

+0

'__eq __()'정의가 충분하지 않습니다. C '클래스가'__eq __()'만 정의하면'C (12)! = C (12)'는 True입니다. 이것은 원래의 포스터가 아닌 것입니다. 원한다. – EOL

+0

응답 해 주셔서 감사합니다. – Richard