2010-12-10 11 views
4

Probablement un doublon, mais je ne trouve pas la réponse en cherchant avec ces termes, au moins.Python: définir plusieurs variables de même type?

Existe-t-il un moyen plus rapide de faire cela en Python?

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

J'ai essayé

level1 = level2 = level3 = {} 

Mais cela semble créer des copies de l'objet, ce qui est pas ce que je veux. Et

level1, level2, level3 = {} 

génère une erreur.

+1

* qui semble créer des copies de l'objet * - Le code 'level1 = level2 = level3 = {}' ne crée aucune copie de dict. –

+2

Juste une terminologie nitpick, mais 'level1 = level2 = level3 = {}' ne crée en fait pas de copies. Si elle a créé une copie, le comportement serait exactement ce que vous voulez. Au lieu de cela, il attribue tous les 3 au même objet, et non à des copies de l'objet. – Davy8

+6

@ Davy8 Je ne pense pas que ça fait du tapage lorsque quelqu'un a dit le contraire de ce qu'ils voulaient dire. –

Répondre

14

Votre nom de la variable est un signe possible que votre conception pourrait être améliorée. Il pourrait être préférable d'utiliser une liste au lieu de trois variables distinctes:

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

Ou utilisez la liste de suggestions suggérées par @nils: 'levels = [{} pour _ in range (3)]' –

+2

ou d'ailleurs 'levels = []' et ajoutez vos dictionnaires au fur et à mesure que vous les créez – Pete

11

Vous pouvez faire

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

ne crée pas des copies. Il laisse le niveau de référence {1-3} au même objet. Vous pouvez utiliser une compréhension de la liste à la place:

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

ou plus lisible:

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

En langage vernaculaire Python, 'dummy' est mieux indiqué par un seul trait de soulignement' _' –

+0

Pas si vous voulez utiliser '_' pour gettext. – nils

0

Python est interprété qui permet la définition des choses à effectuer lors de l'exécution.

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

Personnellement, je ne change jamais de code pour compresser plus de choses sur une ligne. Avoir trois affectations différentes est la façon dont je le ferais, un par ligne. Cependant, s'il y a des améliorations de performances documentées en effectuant un tel changement, c'est autre chose. Je ne connais aucune amélioration des performances avec ces changements. Seulement obfuscation.

0

Les gens ont déjà répondu à l'intention de votre question, mais ...

est-il un moyen plus rapide de le faire en Python?

Qu'entendez-vous par plus rapide?

Je pense que votre vraie question devrait être "quelle est la façon pythonique de faire cela?"

level1, level2, level3 = {}

De l'Python documentation:

tuples sont réalisés par l'opérateur virgule (pas entre crochets), avec ou sans parenthèses fermantes, mais un tuple vide doit avoir les parenthèses fermantes, telles que a, b, c ou() Un seul tuple d'élément doit avoir une virgule, comme (d,)

a, b, c est implicitement (a, b, c). C'est pourquoi vous devez avoir un 3-tuple sur le côté droit comme suggéré par d'autres affiches (nils, sdolan, artilleur).

On a représenté explicitement qu'ils proposent ceci:

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

Essayez ceci: niveau1, niveau 2, Level3 = [{}] * 3

+0

Cela aurait le même problème. – kqr

Questions connexes