2011-01-15 3 views

Antwort

3

a[:] ist ein Spezialfall eines Slicing-Vorgangs, der nur für Sequenzen definiert ist. Es ist eine Kurzform von a[0:len(a)]. Ein Diktat ist keine Sequenz.

+0

Können Sie mit der Dokumentation verlinken, die angibt, dass '[:]' äquivalent zu '[0: len (a)]' ist? –

+1

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

3

a[:] ist ein schneller Weg, um eine flache Kopie von list (und tuple) zu machen. Siehe unten auf der Unterseite des docs für die Erläuterung der verschiedenen Arten des Kopierens.

Daher würde es Grund zu der Annahme geben, dass del a [:] auf einem Wörterbuch nicht wirklich viel Sinn macht.

Wenn Sie das gesamte Wörterbuch löschen möchten, können Sie einfach tun 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

Wrong nicht. 'del S [:]' in einer Sequenz löscht alle Elemente, berührt jedoch nicht den Namen selbst, im Gegensatz zu 'del S', das nur den Namen löscht und die Elemente nicht beeinflusst. –

+0

@ IgnacioVazquez-Abrams: Ich bin verwirrt, warum diese Anweisung so verhält. Da s [:] eine flache Kopie der Liste zurückgibt, scheint es logisch, dass del s [:] nur das zurückgegebene Objekt löschen würde, aber es funktioniert nicht so. Irgendeine Idee warum? Ist es nur eine seltsame Eigenart der Sprache? –

+0

@Joel: Ja. Wenn der Name indexiert wird, ist "del" ein Sonderfall, und stattdessen wird die Methode '__delitem __()' des Objekts aufgerufen. –

3

Der Grund ist einfach: Es ist nicht definiert. Es gibt keinen Grund, warum es nicht funktionieren könnte, wenn jemand sich anstrengt, das leere Stück zu fangen und an die entsprechende Methode zu delegieren.

Auf der anderen Seite würde dies ein Symmetrieprinzip verletzen mit dem Zuweisen und Erhalten der gleichen Scheibe, so würde wahrscheinlich nicht Akzeptanz gewinnen.

+0

Können Sie eine Verknüpfung zu den erforderlichen speziellen Methodennamen herstellen, die dies ermöglichen? (Ich habe nicht die Absicht, es zu tun, aber wäre es relevant, warum dieser Anruf fehlschlägt). –

+0

Die drei Methoden unter http://docs.python.org/reference/datamodel.html#object.__getitem__. –

+0

+1 für den Kommentar, aber die Antwort ist nicht sehr nützlich. –

1

Wenn diese Funktionalität für Ihr System von entscheidender Bedeutung ist, können Sie das integrierte dict-Modul ableiten, um diese Funktion hinzuzufügen.

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 für das Ausbrechen des Slicing Zeug –

0

Wenn Sie tun del a[1] Sie nicht das erste Element im Wörterbuch zu löschen, sind Sie mit der Taste 1 Wörterbuch, das Element zu löschen hat keine Bestellung und somit algorigthm Schneiden (in diesem Fall zumindest). Deshalb mit dem dict a = {1 : 'one', 5 : 'five'} Sie del a[1] tun können und del a[2] oder del a[0]

Verwandte Themen