首页 > 解决方案 > 在函数中使 vars() 定义的变量成为全局变量

问题描述

我正在为我的实验运行多个场景,这需要我根据Scenarioand动态更改变量名称Class。为此,我有几行工作代码,其中更改模拟(即ScenarioClass)会更改变量名称。但是,每次定义实验后都需要调用此代码。下面的代码:

# 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

标签: python-3.xvariables

解决方案


我认为这还可以更简单。处理密钥需要一些成本,所以我不会让它们过长。请注意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))

选择哪种方法效果最好取决于您希望如何恢复数据。


推荐阅读