我正在尝试使用一个简单的try语句和一个for循环语句来初始化以前未定义的变量列表。
这是我写的代码:
for i in ['var1', 'var2', 'var3']:
try:
i
except NameError:
i = []
它无法正常工作。运行它之后,如果以前没有定义这些变量,我想使用var1 = [],var2 = []和var3 = []。
关于我要完成的工作,这里有更多细节。预定的任务应该每60秒运行一次,我想跟踪进度:
def run_schduled():
for i in ['var1', 'var2', 'var3']:
try:
i
except NameError:
i = []
var1.append(random.randint(0,100))
var2.append(random.randint(0,100))
var3.append(random.randint(0,100))
schedule.every(60).seconds.do(run_schduled)
while True:
schedule.run_pending()
time.sleep(30)
答案 0 :(得分:1)
一种解决方案是使用defaultdict
:
from collections import defaultdict
my_dict = defaultdict(lambda: [])
my_dict['var1'].append(1)
print(my_dict['var1']) # prints '[1]'
但是,这不允许您简单地执行print(var1)
,因为在本地(或全局)名称空间中仍未将其定义为标记值。它仅在defaultdict
实例中作为键存在。
另一种选择是使用一个类:
class TaskRunner:
def __init__(self, var1=None, var2=None, var3=None):
self.var1 = var1 or []
self.var2 = var2 or []
self.var3 = var3 or []
def run_scheduled(self):
for i in [self.var1, self.var2, self.var3]:
i.append(random.randrange(1, 10000000))
runner = TaskRunner()
schedule.every(60).seconds.do(runner.run_scheduled)
您还可以使用pickle
保存实例以供以后加载(即在以后的工作中加载)。
答案 1 :(得分:0)
尝试使用全局变量:
In [82]: for i in ['var1', 'var2', 'var3']:
...: if i in globals():
...: print(f'{i} already present in the global namespace')
...: else:
...: globals()[i] = []
...:
In [83]: var1
Out[83]: []