¿Cómo puedes crear variables dinámicamente a través de un bucle while?

Quiero crear variables dinámicamente a través de un bucle while en Python. ¿Alguien tiene algún medio creativo para hacer esto?

A menos que haya una necesidad abrumadora de crear un lío de nombres de variables, solo usaría un diccionario, donde puede crear dinámicamente los nombres de clave y asociar un valor a cada uno.

a = {} k = 0 while k < 10:  key = ...  value = ... a[key] = value k += 1 

También hay algunas estructuras de datos interesantes en el nuevo módulo de ‘colecciones’ que podrían ser aplicables:

http://docs.python.org/dev/library/collections.html

jugar con globals () lo hace posible:

 import random alphabet = tuple('abcdefghijklmnopqrstuvwxyz') print '\n'.join(repr(u) for u in globals() if not u.startswith('__')) for i in xrange(8): globals()[''.join(random.sample(alphabet,random.randint(3,26)))] = random.choice(alphabet) print print '\n'.join(repr((u,globals()[u])) for u in globals() if not u.startswith('__')) 

un resultado:

 'alphabet' 'random' ('hadmgoixzkcptsbwjfyrelvnqu', 'h') ('nzklv', 'o') ('alphabet', ('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z')) ('random', ) ('ckpnwqguzyslmjveotxfbadh', 'f') ('i', 7) ('xwbujzkicyd', 'j') ('isjckyngxvaofdbeqwutl', 'n') ('wmt', 'g') ('aesyhvmw', 'q') ('azfjndwhkqgmtyeb', 'o') 

Utilicé el azar porque no explicas qué nombres de “variables” dar y qué valores crear. Porque no creo que sea posible crear un nombre sin vincularlo a un objeto.

Utilice el método exec (). Por ejemplo, supongamos que tiene un diccionario y desea convertir cada clave en una variable con su valor de diccionario original puede hacer lo siguiente.

Python 2

 >>> c = {"one": 1, "two": 2} >>> for k,v in c.iteritems(): ... exec("%s=%s" % (k,v)) >>> one 1 >>> two 2 

Python 3

 >>> c = {"one": 1, "two": 2} >>> for k,v in c.items(): ... exec("%s=%s" % (k,v)) >>> one 1 >>> two 2 

Rellenar cosas en los espacios de nombres globales y / o locales no es una buena idea. Usar un dict es algo que otro idioma-ish … d['constant-key'] = value simplemente se ve incómodo. Python es OO. En palabras de un maestro: “” “Los espacios de nombres son una gran idea, ¡vamos a hacer más de esos!” “”

Me gusta esto:

 >>> class Record(object): ... pass ... >>> r = Record() >>> r.foo = 'oof' >>> setattr(r, 'bar', 'rab') >>> r.foo 'oof' >>> r.bar 'rab' >>> names = 'id description price'.split() >>> values = [666, 'duct tape', 3.45] >>> s = Record() >>> for name, value in zip(names, values): ... setattr(s, name, value) ... >>> s.__dict__ # If you are suffering from dict withdrawal symptoms {'price': 3.45, 'id': 666, 'description': 'duct tape'} >>> 

Los parámetros de palabras clave le permiten pasar variables de una función a otra. De esta manera, puede usar la clave de un diccionario como nombre de variable (que puede rellenarse en su bucle while). El nombre del diccionario solo debe ir precedido por ** cuando se llama.

 # create a dictionary >>> kwargs = {} # add a key of name and assign it a value, later we'll use this key as a variable >>> kwargs['name'] = 'python' # an example function to use the variable >>> def print_name(name): ... print name # call the example function >>> print_name(**kwargs) python 

Sin ** , kwargs es solo un diccionario:

 >>> print_name(kwargs) {'name': 'python'} 

NOTA: Esto debe considerarse una discusión en lugar de una respuesta real.

Un enfoque aproximado es operar __main__ en el módulo en el que desea crear variables. Por ejemplo, hay un b.py :

 #!/usr/bin/env python # coding: utf-8 def set_vars(): import __main__ print '__main__', __main__ __main__.B = 1 try: print B except NameError as e: print e set_vars() print 'B: %s' % B 

Ejecutarlo saldría

 $ python b.py name 'B' is not defined __main__  B: 1 

Pero este enfoque solo funciona en una secuencia de comandos de un solo módulo, ya que __main__ que importa siempre representará el módulo de la secuencia de comandos de entrada que ejecuta python, esto significa que si b.py está involucrado en otro código, la variable B se creará en el scope del script de entrada en lugar de en b.py Supongamos que hay un script a.py :

 #!/usr/bin/env python # coding: utf-8 try: import b except NameError as e: print e print 'in a.py: B', B 

Ejecutarlo saldría

 $ python a.py name 'B' is not defined __main__  name 'B' is not defined in a.py: B 1 

Tenga en cuenta que __main__ se cambia a 'a.py' .

 vars()['meta_anio_2012'] = 'translate' 

Por la libertad:

 import random alphabet = tuple('abcdefghijklmnopqrstuvwxyz') globkeys = globals().keys() globkeys.append('globkeys') # because name 'globkeys' is now also in globals() print 'globkeys==',globkeys print print "globals().keys()==",globals().keys() for i in xrange(8): globals()[''.join(random.sample(alphabet,random.randint(3,26)))] = random.choice(alphabet) del i newnames = [ x for x in globals().keys() if x not in globkeys ] print print 'newnames==',newnames print print "globals().keys()==",globals().keys() print print '\n'.join(repr((u,globals()[u])) for u in newnames) 

Resultado

 globkeys== ['__builtins__', 'alphabet', 'random', '__package__', '__name__', '__doc__', 'globkeys'] globals().keys()== ['__builtins__', 'alphabet', 'random', '__package__', '__name__', 'globkeys', '__doc__'] newnames== ['fztkebyrdwcigsmulnoaph', 'umkfcvztleoij', 'kbutmzfgpcdqanrivwsxly', 'lxzmaysuornvdpjqfetbchgik', 'wznptbyermclfdghqxjvki', 'lwg', 'vsolxgkz', 'yobtlkqh'] globals().keys()== ['fztkebyrdwcigsmulnoaph', 'umkfcvztleoij', 'newnames', 'kbutmzfgpcdqanrivwsxly', '__builtins__', 'alphabet', 'random', 'lxzmaysuornvdpjqfetbchgik', '__package__', 'wznptbyermclfdghqxjvki', 'lwg', 'x', 'vsolxgkz', '__name__', 'globkeys', '__doc__', 'yobtlkqh'] ('fztkebyrdwcigsmulnoaph', 't') ('umkfcvztleoij', 'p') ('kbutmzfgpcdqanrivwsxly', 'a') ('lxzmaysuornvdpjqfetbchgik', 'n') ('wznptbyermclfdghqxjvki', 't') ('lwg', 'j') ('vsolxgkz', 'w') ('yobtlkqh', 'c') 

De otra manera:

 import random pool_of_names = [] for i in xrange(1000): v = 'LXM'+str(random.randrange(10,100000)) if v not in globals(): pool_of_names.append(v) alphabet = 'abcdefghijklmnopqrstuvwxyz' print 'globals().keys()==',globals().keys() print for j in xrange(8): globals()[pool_of_names[j]] = random.choice(alphabet) newnames = pool_of_names[0:j+1] print print 'globals().keys()==',globals().keys() print print '\n'.join(repr((u,globals()[u])) for u in newnames) 

resultado:

 globals().keys()== ['__builtins__', 'alphabet', 'random', '__package__', 'i', 'v', '__name__', '__doc__', 'pool_of_names'] globals().keys()== ['LXM7646', 'random', 'newnames', 'LXM95826', 'pool_of_names', 'LXM66380', 'alphabet', 'LXM84070', '__package__', 'LXM8644', '__doc__', 'LXM33579', '__builtins__', '__name__', 'LXM58418', 'i', 'j', 'LXM24703', 'v'] ('LXM66380', 'v') ('LXM7646', 'a') ('LXM8644', 'm') ('LXM24703', 'r') ('LXM58418', 'g') ('LXM84070', 'c') ('LXM95826', 'e') ('LXM33579', 'j')