簡體   English   中英

當變量尚未在 python 中聲明時初始化變量

[英]Initialize variables when they're not already declared in 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)

一種解決方案是使用defaultdict

from collections import defaultdict

my_dict = defaultdict(lambda: [])
my_dict['var1'].append(1)
print(my_dict['var1'])  # prints '[1]'

但是,這不允許您簡單地執行print(var1) ,因為它仍然在您的本地(或全局)命名空間中未定義為標記值。 它只會作為鍵存在於defaultdict實例中。

另一種選擇是使用 class:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM