2010-12-10 10 views
4

Wahrscheinlich ein Duplikat, aber ich kann die Antwort nicht finden, indem ich mindestens mit diesen Begriffen suche.Python: Definieren Sie mehrere Variablen des gleichen Typs?

Gibt es einen schnelleren Weg, dies in Python zu tun?

level1 = {} 
level2 = {} 
level3 = {} 

Ich habe

versucht
level1 = level2 = level3 = {} 

Aber das scheint Kopien des Objekts zu erstellen, die nicht ist, was ich will. Und

level1, level2, level3 = {} 

löst einen Fehler aus.

+1

*, die Kopien des Objekts * zu schaffen scheint - Der Code 'level1 = level2 = level3 = {}' erstellt keine Kopien des Diktats. –

+2

Nur eine Terminologie Nitpick, aber 'level1 = level2 = level3 = {}' erstellt in der Tat keine Kopien. Wenn es eine Kopie erstellt, wäre das Verhalten genau das, was Sie wollen. Stattdessen weist es alle 3 demselben Objekt zu, nicht den Kopien des Objekts. – Davy8

+6

@ Davy8 Ich glaube nicht, dass es pingelig ist, wenn jemand das Gegenteil von dem sagte, was er sagen wollte. –

Antwort

14

Ihre Variablennamen ein mögliches Zeichen dafür, dass Ihr Design verbessert werden könnte. Es könnte besser sein, eine Liste zu verwenden, anstatt von drei separaten Variablen:

levels = [{}, {}, {}] 
+0

Oder verwenden Sie das von @nils vorgeschlagene Listenverständnis: 'levels = [{} für _ im Bereich (3)]' –

+2

oder 'levels = []' und fügen Sie Ihre Wörterbücher hinzu, wenn Sie sie erstellen – Pete

11

könnten Sie

tun
level1, level2, level3 = {}, {}, {} 
3
level1, level2, level3, = {}, {}, {} 
16
level1 = level2 = level3 = {} 

Enthält Kopien nicht erstellen. Es lässt die Referenzstufe {1-3} auf das selbe Objekt zu. Sie können eine Liste Verständnis anstatt:

level1, level2, level3 = [{} for dummy in range(3)] 

oder besser lesbar:

level1, level2, level3 = {}, {}, {} 
+8

In Python-Umgangssprache, 'dummy' wird besser durch einen einzelnen Unterstrich' _' angezeigt. –

+0

Nicht wenn Sie '_' für gettext verwenden wollen. – nils

0

Python interpretiert wird, welche die Definitionen der Dinge ermöglicht zur Laufzeit vorgenommen werden.

def prefixed_range(prefix, start, stop=None, step=1): 
    " Like xrange() but results are prefixed numeric strings. """ 
    prefix = str(prefix) 
    if stop is None: 
     start, stop = 0, start 
    for i in xrange(start, stop, step): 
     yield prefix + str(i) 

def define_vars(names, value=None, namespace=None): 
    namespace = globals() if not namespace else namespace 
    factory = (lambda: value) if not callable(value) else value 
    for name in names: 
     namespace[name] = factory() 

define_vars(prefixed_range('level', 1, 4), dict) 

print 'level1: {}, level2: {}, level3: {}'.format(level1, level2, level3) 
# level1: {}, level2: {}, level3: {} 
1

Ich persönlich ändern nie Code, um mehr Zeug in einer Zeile zu drücken. Haben drei verschiedene Aufgaben ist die Art, wie ich es tun würde, eins pro Zeile.

Wenn jedoch durch eine solche Änderung Leistungsverbesserungen dokumentiert werden, ist das eine andere Sache. Ich kenne keine Leistungsverbesserungen mit diesen Änderungen. Nur Verschleierung.

0

Menschen beantwortet haben bereits die Absicht Ihrer Frage, aber ...

Gibt es einen schnelleren Weg, dies in Python zu tun?

Was meinst du mit schneller?

Ich denke, Ihre eigentliche Frage sollte sein "was ist der pythonische Weg, dies zu tun?"

ebenen1, Level2, Level3 = {}

Vom Python documentation:

Tupeln werden durch den Komma-Operator (nicht in eckigen Klammern) konstruiert, mit oder ohne umschließende Klammern, aber ein leeres Tupel muss die umschließenden Klammern haben, wie a, b, c oder(). Ein einzelnes Tupel muss ein abschließendes Komma haben, wie zB (d,).

a, b, c ist implizit (a, b, c). Deshalb musst du ein 3-Tupel auf der rechten Seite haben, wie es von anderen Postern vorgeschlagen wurde (Nils, Sdolan, Kanonier).

gezeigt explizit sie dies sind, was darauf hindeutet:

(level1, level2, level3) = ({}, {}, {},) 
-1

starten: ebenen1, Level2, Level3 = [{}] * 3

+0

Das hätte das gleiche Problem. – kqr

Verwandte Themen