当变量尚未在python中声明时初始化

时间:2019-11-21 00:23:54

标签: python python-3.x

我正在尝试使用一个简单的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)

2 个答案:

答案 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]: []