为什么这不起作用?打印语句中以下所有变量的评估结果为无。
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)
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)
答案 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)