2011-03-11 22 views
20

Soy consciente de que puedo asignar múltiples variables a varios valores a la vez con:asignar múltiples variables a la vez con los nombres de las variables dinámicas

(foo, bar, baz) = 1, 2, 3 

Y tienen foo = 1, bar = 2, y así sucesivamente.

Pero, ¿cómo podría hacer que los nombres de las variables sean más dinámicos? Es decir,

somefunction(data,tupleofnames): 
    (return that each name mapped to a single datum) 

somefunction((1,2,3),(foo,bar,baz))  

¿Y tiene lo mismo?

+0

¿Qué es este acto de variables de asignación como este (foo , bar, baz = 1,2,3) llamado? (en lugar de asignar foo = 1, bar = 2, baz = 3). ¡Gracias! –

+1

Hola @sindhus! Se llama 'asignación de desestructuración'. Python lo tuvo por un tiempo, y fue agregado recientemente a JavaScript. – mikemaccana

Respuesta

10

¿Qué le parece esto?

def somefunction(data, tupleofnames): 
    length = len(tupleofnames) 
    for i in range(0, length): 
     globals()[tupleofnames[i]] = data[i] 

Aquí asumen tanto los datos como tupleofnames son listas donde tupleofnames es una lista de cadenas. Pero como Thomas mencionó, esto no es una buena práctica. Puede corromper fácilmente tu aplicación.

+0

Después de un poco de deliberación: aunque entiendo que asignar lo que parecen ser nombres de variables arbitrarios puede ser una mala idea, me gusta esta respuesta porque muestra que es posible (y mi interés es principalmente académico). ¡Gracias por tu respuesta! – mikemaccana

13

Hay formas de hacerlo, pero no son formas agradables, y se considera una mala práctica en Python. Las nuevas variables no deberían ser creadas por magia. Si desea tener una colección de cosas, use una lista, diccionario o conjunto, según corresponda.

Por ejemplo, se puede devolver un diccionario: {"foo":1, "bar":2, "baz":3}

3

Mira la documentos de ayuda para la postal & mapa. p. para comprimir: -

>>> zip((1,2,3) , ('foo','bar','baz')) 
[(1, 'foo'), (2, 'bar'), (3, 'baz')] 

El mapa requiere una función para mapear secuencias juntas. Sin embargo, puede usar None en lugar de una función para devolver los mismos resultados que zip hace arriba.

>>> map(None, (1,2,3) , ('foo','bar','baz'))                      
[(1, 'foo'), (2, 'bar'), (3, 'baz')] 
+0

¿de qué sirve usar el mapa aquí? ¡esto es exactamente para lo que está 'zip'! –

5

Si los diccionarios no son lo que quiere, entonces posiblemente los nombrados son los mejores: permiten la creación eficiente de varias instancias de datos agrupados, con atributos nombrados.

http://docs.python.org/library/collections.html#collections.namedtuple

from collections import namedtuple 


mytype = namedtuple("mytype", "foo bar baz") 

a = mytype(1,2,3) 
a.foo 
1 
a.bar 
2 
a.baz 
3 
5

Puede hacerlo de esta manera:

(foo, bar, baz) = (1, 2, 3) 
+1

y luego incluso '(foo, bar, baz) = [Ninguno] * 3' – Tjorriemorrie

+1

Esto parece ser funcionalmente idéntico a la primera línea de código en la pregunta, y definitivamente no involucra nombres variables dinámicos - ¿incluso leyó cualquier parte del cuerpo de la pregunta, o solo el título? ¿O me estoy perdiendo algo? – Dukeling

-1
(foo, bar, baz) = [None] * 3  
a,b,c = [0]*3  
a,b,c = ["nihao"]*3 
-1

entiendo las respuestas anteriores son ya todo lo que necesitan, pero tengo un buen truco fresco de programación que podrían también te ayudan cuando quieres asignar una tupla particular a las variables.

tupla T

T = (A, B, C)

las variables

VAR1, var2, var3 = T

Cuestiones relacionadas