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

2024-10-01 19:29:43 发布

您现在位置:Python中文网/ 问答频道 /正文

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


Tags: runinfor定义random语句randinttry
2条回答

一种解决方案是使用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保存实例以便稍后加载(即,在随后的作业运行中)。你知道吗

尝试全局:

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

相关问题 更多 >

    热门问题