0

单一分配的工作方式如下:(可能有更好的方法)

b='bb'
vars()[b] = 10
bb
>>>10

但如果我这样做:

c='cc'
vars() [b,c]= 10,11

它没有成功分配bband cc

我不明白为什么,也不明白如何最好地做到这一点。

谢谢

PS,有几个人非常合理地问我为什么要这样做。我发现我正在根据用户指定的选项设置很多变量和对象。因此,如果用户指定选项 2、3 和 7,我想创建 a2、a3 和 7,以及 b2、b3、b7 等。这可能不是通常的做法,但使用 vars 和 eval 是一种非常简单和透明的方式做到这一点,需要简单简洁的代码:

对于 input_vector 中的 i: vars()['a'+input_vector[i]] = create_a (input_vector[i])

对于 input_vector 中的 i:vars()['b'+input_vector[i]] = create_b (input_vector[i])

这适用于某些数据。问题是当我使用另一个函数 create_c_and_d 时。这需要我将以上两行压缩成一个函数调用。如果这可以使用字典轻松完成,我很乐意切换到该方法。我是 python 新手,所以它是否可以对我来说并不明显。

4

2 回答 2

3

因为b,c是 a tuple,所以你实际上是在分配 key ('bb', 'cc')

>>> vars() [b,c]= 10,11
>>> vars()[('bb', 'cc')]
(10, 11)

>>> x = b,c
>>> type(x)
<type 'tuple'>
于 2013-11-08T19:51:02.913 回答
0

我不明白为什么,也不明白如何最好地做到这一点。

好吧,我不得不说,呃.. 最好的办法是不这样做。完全没有。

只需使用dict应该使用的类似:

d = {}
d['aa'] = 10
d['bb'] = 11

无论如何,要回答您的问题,您tuple在错误的地方进行拆包。或者,更确切地说,根本不拆包;当您指定a,ba时dict,这意味着您正在分配 atuple作为键。相反,像这样解压:

vars()[b], vars()[c] = 10,11

我将再次建议您不要这样做,而只使用dicts 将字符串(或任何可散列的数据类型)映射到值。动态命名变量不是好的做法。

于 2013-11-08T19:57:28.093 回答