[英]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.