def func(key):
return newfunc(var[key])
功能:
hello = func('hello') = newfunc('world')
我想得到这样的结果:varlist = list(var.keys())
for i, variab in enumerate(varlist):
varname = variab
variab = func(varname)
。
variab
但问题最后没有定义变量,因为在下一次迭代开始时会覆盖变量for
。那么我还有其他方法来编写hello = func('hello')
循环来定义dict中的所有变量吗?
我知道我可以继续每行写sudo ln -s /usr/lib/libGLEW.so /usr/lib/libGLEW.so.2.0
和其他变量,但我想知道是否有其他方法可以。
答案 0 :(得分:2)
您可能会发现这篇文章值得一读:http://stupidpythonideas.blogspot.com/2013/05/why-you-dont-want-to-dynamically-create.html/
问题的简短回答是:当你这样做时:
variab = func(varname)
您没有定义新变量,您只是定义存储在变量中的值。 Variab
是静态的。这个名字没变。要定义静态变量,请使用语法
globlas()[variablename] = variablevalue
虽然这是可能的,但它引出了为什么这样的问题?几乎没有必要以这种方式动态创建变量,这就是为什么你通常不会在编程中看到这种模式的原因。解决方案?使用数据结构来正确解决问题。
本文建议使用词典,但根据您的数据结构,您也可以使用类。这取决于你想要完成的问题。
如果您必须使用动态创建的全局变量,我强烈建议您在此之前超过new to Python
阶段。同样,当前的代码模式和数据结构存在是有原因的,我不鼓励自愿避免使用它们而采用变通方式解决方案。
答案 1 :(得分:0)
可以动态创建变量,但这并不明智。维护是一场噩梦。将函数存储在字典中会更好,其中键值是动态创建的变量。这应该让你知道如何做到这一点:
#!/usr/bin/python
h = {'hello': 'world', 'good': 'day', 'see': 'you' }
def func(v):
def newfunc():
return v
return newfunc
for k,v in h.items():
h[k] = func(v)
a = h['hello']()
b = h['good']()
c = h['see']()
print("a = {}".format(a))
print("b = {}".format(b))
print("c = {}".format(c))
答案 2 :(得分:0)
首先,这些值是可调用函数还是字符串值?
如果它们是一些可调用函数,例如:
a = {'hello': hello, 'world': world}
简单直接:
A = {'hello': hello, 'world': world}
def foo(var):
callback = A.get(var, None)
# You cancheck and raise when the value
# is not a method.
if not callable(callback):
raise
return callback
foo('hello')
答案 3 :(得分:0)
你可以将变量fn对放在dict中。 还有一些评论:
varlist = list(var.keys())
行,您只需使用for variab in var.keys()
... var.keys()
。 for key in dictionary
遍历字典的键,因此您只需使用for variab in var
。这样的事情会起作用:
fn_dict = {}
for varname in var:
fn_dict[varname] = func(varname)
在循环结束时,您将使用所需的键,函数对填充fn_dict。