2011-01-15 11 views
1

여기 무슨 일 이니?왜 dict [:]을 호출 할 수 없습니까?

>>> a = {1: "a", 2: "b"} 
>>> del a[1] 
>>> a 
{2: 'b'} 
>>> a = {1: "a", 2: "b"} 
>>> del a[:] 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: unhashable type 
>>> a.clear() 
>>> a 
{} 

dict.clear으로 전화해야하는 이유는 무엇입니까?

답변

3

a[:]은 시퀀스에 대해서만 정의 된 조각 작업의 특수한 경우입니다. 짧은 형태의 a[0:len(a)]입니다. dict은 시퀀스가 ​​아닙니다.

+0

'[:]'는'[0 : len (a)]'과 동등한 문서를 링크 할 수 있습니까? –

+1

http://docs.python.org/library/stdtypes.html#sequence-types-str-unicode-list-tuple-bytearray-buffer-xrange note (4) – Amber

3

a[:]list (및 tuple)의 간단한 복사본을 만드는 빠른 방법입니다. 다양한 유형의 복사에 대한 설명은 docs 하단을 참조하십시오.

따라서 사전에서 del a [:]는별로 의미가 없다고 말할 수 있습니다.

는 전체 사전을 삭제하려면, 당신은 단순히 del a

>>> a = {1: "a", 2: "b"} 
>>> del a 
>>> a 

Traceback (most recent call last): 
    File "<pyshell#8>", line 1, in <module> 
    a 
NameError: name 'a' is not defined 
>>> 
+2

잘못을 할 수없는 이유 때문이다. 'del S [:]'는 순차적으로 모든 항목을 지우지 만 이름 자체는 지우지 않습니다. 'del S'는 이름 만 지우고 항목에는 영향을 미치지 않습니다. –

+0

@ IgnacioVazquez-Abrams : 왜 그 문장이 그런 식으로 행동하는지 혼란 스럽습니다. s [:]는리스트의 얕은 사본을 반환 할 것이기 때문에 del s [:]는 단지 반환 된 객체를 지우지 만, 그런 식으로는 작동하지 않는다는 것은 논리적 인 것처럼 보인다. 왜 그런가? 언어의 이상한 특질인가요? –

+0

@Joel : 예. 'del'은 이름이 색인 될 때 ​​특별한 경우이고, 객체의'__delitem __()'메쏘드가 대신 호출됩니다. –

3

을 할 수있는 이유는 오히려 간단하다 : 그것은 정의되어 있지 않습니다. 누군가가 빈 슬라이스를 잡아 당겨 적절한 방법으로 위임 할 경우 작동하지 않을 이유가 없습니다.

반면에 이것은 동일한 슬라이스를 할당하고 가져 오는 대칭 원리를 위반하므로 수용하지 못할 수 있습니다.

+0

이것을 허용 할 특별한 메소드 이름을 연결할 수 있습니까? (나는이 작업을 수행 할 의사가 없지만이 호출이 실패한 이유와 관련이있다). –

+0

http://docs.python.org/reference/datamodel.html#object.__getitem__에서 세 가지 방법을 사용할 수 있습니다. 덧글에 +1 –

+0

+1하지만 대답은별로 유용하지 않습니다. –

1

이 기능이 시스템에 중요하면이 기능을 추가하기 위해 기본 내장 함수의 하위 클래스를 만들 수 있습니다.

import sys 
class newdict(dict): 

    def __delslice__(self,i,j): 
     if i==0 and j==sys.maxint: 
      self.clear() 
     else: 
      dict.__delslice__(self,i,j) 
+0

+1 슬라이싱 물건 분리 –

0

당신이, 당신이 어떤 주문이없는 1. 키 사전에있는 요소를 삭제하고, 따라서 적어도이 경우 (algorigthm 슬라이스는 사전의 첫 번째 요소를 삭제하지 않는 del a[1]하고있는). DICT a = {1 : 'one', 5 : 'five'} 당신이 del a[1]을 할 수 del a[2] 또는 del a[0]

관련 문제