使用locals()分配给变量

时间:2019-04-24 17:48:26

标签: python

为什么这不起作用?打印语句中以下所有变量的评估结果为无。

def assign(data):
    first=middle=last=suffix=None
    sep = ','
    fields = ['last','first','middle','suffix']
    a = data
    for name in fields:
        if a: 
            a, *b = a.split(sep)
            print('intermediate: ', a, b)
            if a:
                locals()[name] = a
                a = None
                if b:
                    a = sep.join(b)
    print('first %s middle %s last %s suffix %s ', first, middle, last, suffix)

if __name__ == "__main__":
    data = 'Jon, Bon, Jovi'
    assign(data)

编辑1

Evan要求在下面发布无效代码。警告:我现在完全理解,没有充分的理由要有变化的变量;)

def assign(data):
    first=middle=last=suffix=None
    sep = ','
    fields = ['last','first','middle','suffix']
    a = data
    for name in fields:
        if a: 
            a, *b = a.split(sep)
            print('intermediate: ', a, b)
            if a:
                #locals()[name] = a
                exec('%s = a' % name)
                a = None
                if b:
                    a = sep.join(b)
    print('first %s middle %s last %s suffix %s ', first, middle, last, suffix)

if __name__ == "__main__":
    data = 'Jon, Bon, Jovi'
    assign(data)

2 个答案:

答案 0 :(得分:0)

没有Python方式可以动态地将值分配给局部变量名称。如果您想要这种行为,最简单的解决方案是使用exec

如果仅替换以下行:

locals()[name] = a

使用exec:

exec('%s = a' % name)

在执行过程中检出documentation的执行程序。

答案 1 :(得分:0)

locals()返回新的字典数据。不能引用“分配”功能的堆栈存储器。

我认为您想在创建与名称相关的实例时轻松创建对象。 这段代码如下:

class Name:
    def __init__ (self, data):
        sep = ','
        fields = ['last', 'first', 'middle', 'suffix']
        data = data.split(sep)
        self.fields = {f:d for f, d in zip(fields, data)}

    def __str__ (self):
        orderedFields = ['first', 'middle', 'last', 'suffix']
        output = ''
        for field in orderedFields:
            output += field+' '+self.fields[field]+' '
        return output

if __name__ == '__main__':
    data = Name('Jon, Bon, Jovi, ')
    print (data)