python - 动态分配变量

标签 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 (import cvxpy as cvx),我得到 k 类型“str”。我想去哪里

class 'cvxpy.expressions.variables.variable.Variable'

有什么建议我做错了什么吗?

编辑:我接收字典条目作为字符串输入,例如

"var1 = cvx.Variable(3),var2 = 3"

然后我将其转换成字典

最佳答案

为什么你不应该使用非字符串 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'] 的值,传递给str() ,可能会返回 varX您使用 % 构建的作业右侧的值引用现有变量(在循环之前声明或通过 global 传递给 exec() )。

<小时/>

相反,您的代码应该可以工作,并且您的问题肯定不属于您与我们分享的内容。

作为示例,我在我的计算机上运行以下代码 (Python 2.7.12):

>>> 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 之间存在一些混淆。 ted代码:任何你想要的exec 应该str !如果不是,那么它将变成 str通过直接或间接调用str()内置(通过调用 % 完成),因为 exec需要一个字符串。

<小时/>

如果字符串已按照您的建议正确格式化,您是否考虑过执行以下操作?

str_in = "var1 = cvx.Variable(3),var2 = 3"
exec(str_in.replace(',', ';'))

注意:在这里,我假设您处于不需要 global 的适当范围内。但多一点字符串解析( splitstrip ,...)将使首先将变量声明为 global 变得很简单s。

关于python - 动态分配变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51735189/

相关文章:

javascript - 如何将 JavaScript 变量作为属性存储在对象内部

networking - 无法在 ubuntu 18.04 上运行多个 dnsmasq dhcp 服务器

c++ - 如何在不使用命名空间 std 的情况下取消设置 ios::fixed

python - 获取行直到 ^$

python - Python - Tkinter 中只显示了对 Label 的最后修改。为什么?

python - 从 QuerySet 中仅提取没有键的值并将它们保存到列表中

c++ - C++ 中的魔术表达式 x = y - x + (y = x)

variables - 您可以在 terraform 中将查找函数与包含数组的 map 变量一起使用吗?

python - 从具有匹配词的主列表生成列表,无论顺序如何

xml - 尝试创建通用 XSL 以允许略有不同的 XML 格式