2014-07-19 8 views
1

저는 파이썬에 익숙하지 않고 listset에 추가하는 데 걸림돌이되었습니다. 이제 나는 reason이 무엇인지 알지 못합니다. list이 변경 가능하므로 hashcode (또는 Python 해당 개념)이 변경됩니다. Java 프로그래밍에 비추어 볼 때, 필자는 이것을 여러 번 해왔습니다.세트 목록 추가는 자바에서는 가능하지만 파이썬에서는 가능하지 않습니까?

HashSet<ArrayList<String>> masterCollection = new HashSet<ArrayList<String>>(); 
ArrayList<String> a = new ArrayList<String>(); 
masterCollection.add(a); 
a.add("Hello, World"); 
for(ArrayList<String> list : masterCollection) { 
    // do something to list 
} 

위 코드의 비정상적인 동작을 발견하지 못했습니다. 심지어 ArrayListHashMap의 키로 사용하고 내 작업을 완료하는 데 성공했습니다.

따라서이 기사에서는 Java에서 내부적으로 파이썬이 어떻게 다른지와 위의 코드를 작성할 때주의해야 할 것이 있는지 묻고 싶습니다.

+3

언어가 다릅니다. 모든 언어가 동일한 용어를 사용하더라도 동일한 방식으로 작동하지 않습니다. – Kayaman

+0

@ 카야 만 나는 그들이 다르다는 것을 알고 있으며 나는이 차이를 알고 있습니다. 파이썬이 그렇지 못하더라도 자바가 어떻게 이뤄지는 지 알고 싶다. 이제는 파이썬이 작동하는 방식이 더 합리적인 것처럼 보입니다.'set'은 항상 그 요소의 'hashcode'를 모니터링하고 이에 따라 변경해야 할 책임이 없습니다. 그러나 요소가 바뀔 때마다'hashList' 변경을보고하는'ArrayList '메커니즘이 있다고 생각하지 않습니다. 어떻게 작동합니까? – zyl1024

+2

'HashSet'(또는 유사한 해시 관련 구문)에있는 동안 객체가 해시 코드를 변경하면 결과가 정의되지 않는다는 것은 알려진 사실입니다. 그래서 불변의 것을 넣어야 만합니다. – Kayaman

답변

1

목록은 __hash__을 정의하지 않았기 때문에 파이썬에서 해쉬 할 수 없습니다. 거기에는 이유가 있지만 해시가 객체의 수명 기간 동안 변경되지 않는 한 자신 만의 변경 가능한 클래스를 정의 할 수 있습니다. 예를 들어, id(x)을 해시로 사용합니다. 사실, 당신은 아마 당신 자신의 많은 수업에서 모르는 사이에 그것을 정확하게 구현했을 것입니다.

나는 "해쉬"에 docs 인용합니다 :

의 모든

파이썬의 불변 (예 : 목록 또는 사전 등)에는 변경 가능한 용기가되어 있지 않은 내장 객체, 해쉬 있습니다. 이 사용자 정의 클래스의 인스턴스 인 객체는 기본적으로 해시 가능합니다. 그들은 모두가 (그들 자신을 제외하고) 동일하지 않으며, 그들의 해시 값은 id()입니다.

가변성과 해시 성은 결합되지만 전혀 동일하지는 않습니다.