파일 객체가 해시 가능하고 파이썬 사전의 키에 사용될 수 있다는 것을 알았지 만 파일 객체가 해시되는 방식을 파악할 수 없습니다. 이것은 OS에 따라 inode 나 비슷한 것을 사용합니까?파이썬 파일 객체에서 __hash__은 무엇을합니까?
파이썬 2.7.6 소스를 살펴 보았지만 비어있었습니다. Object/fileobject.c에 tp_hash 함수 포인터가 NULL 인 것 같습니다. 그래서, 파일 객체가 피기 백킹하는 기본 해쉬 함수를 추측하고 있습니다. 이게 어떻게 작동하는지 알아?
필자는 파일 객체가 해시 가능하므로 dict 키로 사용할 수 있다고 가정합니다. 이것에 대한 어떤 단점도 내가 보지 못했을까요?
In [1]: x = open('test.txt', 'r')
In [2]: x.__hash__
Out[2]: <method-wrapper '__hash__' of file object at 0x105760f60>
In [4]: hash(x)
Out[4]: 274161910
감사합니다. 그래서, 질문을 후속. 왜 객체 ID별로 '해시'를 나열하지 않습니까? 나는 좋은 생각이라고 말하는 것이 아니지만, 당신은 dict에서 목록을 키로 사용할 수 있습니다. 나는리스트가 변경 가능하다는 것을 안다.하지만 파일 객체가 아니다. 객체가 id를 가지고 있다고해도 객체가 해시 가능하다고 간주되는 이유에 대한 이해를 시도하는 것뿐입니다. –
@ durden2.0 : 파일 객체는 변경할 수 있지만 변형하면 해시에 영향을주지 않습니다. 리스트가 id에 의해 해시 된 경우, 같지만 구별되는 목록 오브젝트는 해시가 동일하지 않습니다. 그래서 만약 당신이'x = [1, 2, 3]; 두 개의 [1, 2, 3]이 서로 다른 객체이기 때문에 (d [[1, 2, 3]] d [x] = 1 ' 그들은 같은 내용을 가지고 있지만). 이것은 목록에서 원하는 것이 아닙니다. 이에 대한 또 다른 질문이 있습니다. 일반적으로 객체 ID로 해싱하는 것에 대해 더 궁금한 점이있는 경우이 질문의 주제와 조금 다르기 때문에 별도로 질문해야합니다. – BrenBarn
@ durden2.0 : 파일 객체를 자신과 동일하게 만들 수있는 방법은 없습니다. 동등성 테스트는 안정적입니다 (동일한 객체에 대해서만 true). 따라서 해시도 안정적으로 유지됩니다. –