1

何が起きてる?

>>> 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ですか?

4

5 に答える 5

3

a[:]list(および)の浅いコピーを作成する簡単な方法tupleです。さまざまな種類のコピーの説明については、ドキュメントの下部を参照してください。

したがって、辞書の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
>>>
于 2011-01-15T03:05:25.460 に答える
3

理由はかなり単純です:それは定義されていません。誰かが空のスライスをキャッチして適切な方法に委任することに努力した場合、それが機能しなかった理由はありません。

一方、これは同じスライスを割り当てて取得するという対称性の原則に違反するため、おそらく受け入れられないでしょう。

于 2011-01-15T03:09:44.727 に答える
3

a[:]は、シーケンスに対してのみ定義されるスライス操作の特殊なケースです。の短縮形ですa[0:len(a)]。dictはシーケンスではありません。

于 2011-01-15T03:13:12.780 に答える
1

この機能がシステムにとって重要である場合は、組み込みのdictをサブクラス化して、この関数を追加できます。

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)
于 2011-01-15T04:04:41.090 に答える
0

ディクショナリの最初の要素を削除しない場合del a[1]は、キー1の要素を削除します。ディクショナリには順序がないため、(少なくともこの場合は)スライスアルゴリズムがありません。だからこそ、a = {1 : 'one', 5 : 'five'}あなたができることdel a[1]とできないことdel a[2]、またはdel a[0]

于 2011-01-15T12:43:06.713 に答える