如何通过while循环dynamic创buildvariables?

我想通过Python中的while循环dynamic地创buildvariables。 任何人都有这样做的创造性手段?

除非有大量的需求来创build一个variables名称,否则我只需要使用一个字典,在这里你可以dynamic地创build键名,并将值关联到每一个。

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

新的“集合”模块中还有一些有趣的数据结构可能适用:

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

玩globals()使它成为可能:

 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('__')) 

一个结果:

 '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', <module 'random' from 'G:\Python27\lib\random.pyc'>) ('ckpnwqguzyslmjveotxfbadh', 'f') ('i', 7) ('xwbujzkicyd', 'j') ('isjckyngxvaofdbeqwutl', 'n') ('wmt', 'g') ('aesyhvmw', 'q') ('azfjndwhkqgmtyeb', 'o') 

我用随机的,因为你不解释给出的variables名称,以及创build哪些值。 因为我不认为有可能创build一个名字,而不是绑定到一个对象。

将东西填入全局和/或本地命名空间并不是一个好主意。 使用一个字典是这样的一些其他语言ish … d['constant-key'] = value只是看起来尴尬。 Python是OO。 用大师的话说:“”命名空间是一个好主意 – 让我们做更多的!“”

喜欢这个:

 >>> 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'} >>> 

使用exec()方法。 例如,假设你有一个字典,你想把每个关键字变成一个variables,它的原始字典值可以做到以下几点。

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 

关键字参数允许您将variables从一个函数传递到另一个函数。 通过这种方式,可以使用字典的键作为variables名(可以在while循环中填充)。 字典名称在被调用时只需要在**之前。

 # 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 

没有**kwargs只是一个字典:

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

注:这应该被认为是一个讨论,而不是一个实际的答案。

一个近似的方法是在要创buildvariables的模块中运行__main__ 。 例如有一个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 

运行它会输出

 $ python b.py name 'B' is not defined __main__ <module '__main__' from 'b.py'> B: 1 

但是这种方法只能在单个模块脚本中使用,因为它导入的__main__将始终代表python正在执行的入口脚本的模块,这意味着如果b.py被其他代码所涉及, Bvariables将被创build入口脚本的范围而不是b.py本身。 假设有一个脚本a.py

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

运行它会输出

 $ python a.py name 'B' is not defined __main__ <module '__main__' from 'a.py'> name 'B' is not defined in a.py: B 1 

请注意, 'a.py'更改为'a.py'

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

为了自由:

 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) 

结果

 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') 

其他方式:

 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) 

结果:

 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')