我有一个字典,其中包含要动态分配的变量名及其对应的值
dict_ = {'var1':'cvx.Variable(3)', 'var2':'3'}
然后在我的代码中
for k,v in dict_.iteritems():
exec("global %s;%s=%s" % (k,k,v))
print k, type(k)
对于整数变量,这有效,我得到3个类型为'int',但是对于var1(将cvxpy导入为cvx),我得到了k个类型'str'。我想去哪里
class 'cvxpy.expressions.variables.variable.Variable'
有人告诉我我在做什么错吗?
编辑:我正在接收字典条目作为字符串输入,例如
"var1 = cvx.Variable(3),var2 = 3"
然后我将其转换成字典
答案 0 :(得分:1)
dict_
值:如its documentation中所述,%
运算符与str()
格式一起使用时会调用%s
内置函数。
在str()
实例上调用cvxpy.Variable
时,它将返回格式为varX
的字符串,其中X
是整数(已创建变量在内存中的索引) ,我想):
>>> import cvxpy
>>> x = cvxpy.Variable(3)
>>> str(x)
'var0'
不幸的是,这种格式恰好是您收到的用于其变量的字符串使用的命名约定。
定义dict_ = {'var1':cvx.Variable(3), 'var2':3}
不仅会解决您的问题,而且可能会默默地成功,因为传递给dict_['var1']
的{{1}}的值可能会返回{{您使用str()
构建的赋值右侧的1}}值引用了一个现有变量(在循环之前或通过传递给varX
的{{1}}进行声明)。>
相反,您的代码应该可以工作,并且您的问题肯定不在您与我们共享的内容之内。
作为示例,我在计算机上运行以下代码(Python 2.7.12):
%
请注意,如上所述,global
打印exec()
!
似乎大多数注释和此处的解决方案似乎都包含正在运行的代码,字符串解析和>>> import cvxpy
>>> cvxpy.__version__
'1.0.6'
>>> d = {'var1': 'cvxpy.Variable(3)', 'var2': '3'}
>>> for k, v in d.iteritems():
... s = 'global %s; %s = %s' % (k, k, v)
... print s
... exec(s)
...
global var1; var1 = cvxpy.Variable(3)
global var2; var2 = 3
>>> print var1, type(var1)
var0 <class 'cvxpy.expressions.variable.Variable'>
>>> print var2, type(var2)
3 <type 'int'>
注释的代码之间的混淆:您将要print var1
进行的任何操作应该是var0
!如果不是,那么它将直接或间接调用内置的exec
(如您对exec
的调用一样)而成为str
,因为str
需要一个字符串
如果字符串已经按照您的建议正确格式化,您是否考虑过执行以下操作?
str()
NB :在这里,我假设您处于适当的范围,不需要%
,而是需要更多的字符串解析(exec
,{{1 }},...)首先将变量声明为str_in = "var1 = cvx.Variable(3),var2 = 3"
exec(str_in.replace(',', ';'))
很简单。
答案 1 :(得分:0)
将这些变量放入字典中时,将它们明确设置为字符串。改为这样做:
dict_ = {'var1':cvx.Variable(3), 'var2':3}
假设您希望var2
成为int
,而不是str
。否则,当您将var1
的值用引号引起来时,它将默认为stringType
编辑:
PicTo对于您的实现是正确的,因为您使用的是%s
格式,因此您会自动将变量转换为stringType。您正在寻找的东西可能是:
dict_ = {'var1':cvx.Variable(3), 'var2':3}
globals().update(dict_)
这会将变量置于全局范围内,并且使您的类型保持一致,假设您希望变量位于全局范围内。否则,locals()
支持相同的范例
示例:
>>> mydict = {'var1':3, 'var2': "happystring"}
>>> globals().update(dict_)
>>> var1
3
>>> var2
'happystring'