Python:能否从字符串列表中创建新的变量名?

4

我刚开始学习Python,所以不确定这是否可能。我正在尝试从字符串列表中创建变量名列表,以便随后可以为新创建的变量赋值。

我看到了另一个类似的问题,但已经有一个包含键和值的字典。

以下是我的代码:

def handy(self):
    a = raw_input('How many hands? ')
    for i in range(int(a)):
        h = "hand" + str(i+ 1)
            self.list_of_hands.append(h)
            # would like to create variable names from self.list_of_hands
            # something like "hand1 = self.do_something(i)"
            print h
    print self.list_of_hands

鉴于一些回答,我补充以下评论: 然后我将为每个变量分配字典。那么,我是否可以创建一个包含多个字典的字典?


3
  1. 将字符串转换为预先存在的变量名: 这个问题的答案依赖于变量是在哪里定义的。如果它们是在全局命名空间中定义的,你可以使用globals()函数获取全局命名空间的字典并将字符串作为键来访问变量。如果它们是在类中定义的,你可以使用getattr()函数从实例中获取变量。如果它们是在局部作用域中定义的,你可以创建一个字典并将变量名作为键,而不是将变量添加到全局命名空间。
  2. 如何将变量名作为字符串获取: 你可以使用globals()函数来获取全局命名空间的字典,并找到与变量相对应的键。另外,如果变量是在类中定义的,你可以使用getattr()函数从类实例中获取变量名。
  3. 如何将字符串转换为变量名: 在Python中,变量名只是名称,因此无法将字符串直接转换为变量名。但是,你可以使用字典来将字符串作为键,并将变量作为值进行存储。这样,可以通过字符串来引用变量。
- avasal
冒昧问一句,我不太明白你的例子如何适用于这里。有可能将它们应用到我正在尝试做的事情上吗?非常感谢。 - DBWeinstein
1
@dwstein,你试图动态创建变量名。avasal的帖子中提到的解决方案表明,最好使用以变量名为键的字典或列表,因为这些名称只是“hand + <一些数字>”。 - Snakes and Coffee
3个回答

4
为什么不使用字符串作为键来构建字典?
>>> class test():
    def handy(self):
        a = raw_input('How many hands? ')
        d = { "hand" + str(i + 1) : self.do_something(i) for i in range(int(a)) }

        keys = d.keys()
        keys.sort()
        for x in keys:
            print x, '=', d[x]

    def do_something(self, i):
        return "something " + str(i)

>>> test().handy()
How many hands? 4
hand1 = something 0
hand2 = something 1
hand3 = something 2
hand4 = something 3

编辑:您更新了问题,询问是否可以将字典作为字典中的值进行存储。是的,您可以这样做:

>>> d = { i : { j : str(i) + str(j) for j in range(5) } for i in range(5) }
>>> d[1][2]
'12'
>>> d[4][1]
'41'
>>> d[2]
{0: '20', 1: '21', 2: '22', 3: '23', 4: '24'}
>> d[5] = { 1 : '51' }
>> d[5][1]
'51'

2
如果你有多个变量只是以数字结尾不同(hand1, hand2等),你需要一个容器。
我认为字典是最好的选择:
self.hands = {}
self.hands[h] = self.do_something(i)

您可以轻松访问字典中的各个键:
self.hands['hand1']

谢谢!但是,如果我要给每个名称分配一个字典,这样做还有效吗?我想知道是否可以创建一个字典的字典? - DBWeinstein
3
词典是可哈希的,所以它可以工作。 - Blender

2
h = "hand" + str(i+ 1)
vars()[h] = do_something(i)

现在你可以调用hand1来调用do_something()函数。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接