动态分配变量

时间:2018-08-07 20:47:46

标签: python variables namespaces global-variables

我有一个字典,其中包含要动态分配的变量名及其对应的值

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"

然后我将其转换成字典

2 个答案:

答案 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'