python-3.x - 在函数中使 vars() 定义的变量成为全局变量
问题描述
我正在为我的实验运行多个场景,这需要我根据Scenario
and动态更改变量名称Class
。为此,我有几行工作代码,其中更改模拟(即Scenario
和Class
)会更改变量名称。但是,每次定义实验后都需要调用此代码。下面的代码:
# Funtion
def Moisture_transport(Scenario, Class, delta_crop):
""" (unrelated to this question) """
return Class_direct, Class_sum_cmr
""" Define the Scenario and Class """
Scenario = 2; Class = 1; delta_crop = True # Assign the Scenario, Class and delta_crop
## Few lines of code that needs to run every time without any change
if delta_crop == False:
vars()['Moisture_direct_Scenario_'+str(Scenario)+'_Class_'+str(Class)], vars()['Moisture_with_CMR_Scenario_'+str(Scenario)+'_Class_'+str(Class)] = Moisture_transport(Scenario, Class, delta_crop)
else:
vars()['Moisture_direct_Scenario_'+str(Scenario)+'_Class_'+str(Class)+'_deltacrop'], vars()['Moisture_with_CMR_Scenario_'+str(Scenario)+'_Class_'+str(Class)+'_deltacrop'] = Moisture_transport(Scenario, Class, delta_crop)
有谁知道如何vars()['variable_name']
在函数中进行全局化Moisture_transport
?
解决方案
我认为这还可以更简单。处理密钥需要一些成本,所以我不会让它们过长。请注意global
, 它在哪里使用和不使用。
Moisture_variables = {}
def Moisture_transport(Scenario, Class, delta_crop):
global Moisture_variables
""" (unrelated to this question) """
#return Class_direct, Class_sum_cmr
Moisture_variables[f"{Scenario} {Class} {delta_crop}"] = (Class_direct, Class_sum_cmr)
您还可以对结果进行子词典,尽管这会产生一些检查子词典是否存在的开销。注意我故意更改(缩短)被调用函数中的变量,以明确这些变量在不同的范围内。
Moisture_variables = {}
def Moisture_transport(Scenario, Class, delta_crop):
""" (unrelated to this question) """
#return Class_direct, Class_sum_cmr
add_Moisture_Variables(Scenario, Class, delta_crop, Class_direct, Class_sum_cmr)
def add_Moisture_variables(s, c, d, cd, cs):
global Moisture_variables
if s not in Moisture_variables:
Moisture_variables[s] = {}
if c not in Moisture_variables[s]:
Moisture_variables[s][c] = {}
Moisture_variables[s][c][d] = (cd, cs)
如果列表有效,另一种方法是附加元组的双括号很重要。
Moisture_variables = []
def Moisture_transport(Scenario, Class, delta_crop):
global Moisture_variables
""" (unrelated to this question) """
#return Class_direct, Class_sum_cmr
Moisture_variables.append((Scenario, Class, delta_crop, Class_direct, Class_sum_cmr))
选择哪种方法效果最好取决于您希望如何恢复数据。
推荐阅读
- bash - 一个全局计数器,由子shell中并行运行的函数递增
- oracle - 可以强制 ORA 中的 TX 锁定顺序吗?
- tcp - 如果第一个 FIN 或第二个 FIN 在 tcp 4 方式拆除过程中丢失怎么办
- airflow - 如何在气流中排队回填?
- cypress - 使用 Angularjs 测试赛普拉斯。nd-model/data-ng-change 中的值问题
- android - 当应用程序被强行杀死时,LifeCycles 被调用
- html - 如何忽略多选的父溢出?
- python - 给定字符串的索引如何恢复相应的单词/标记?
- php - 当文件名包含特殊字符(俄语、中文...)时,SplFileInfo::getSize 不起作用
- haskell - 如何在haskell中反转图形?