【问题标题】:How to redefine a varying variable in a function from outside?如何从外部重新定义函数中的可变变量?
【发布时间】:2019-09-24 17:16:03
【问题描述】:
  • 已编辑以考虑初始反馈

要对模型中的某些参数进行敏感性分析,我想覆盖并重新定义单个变量。这个变量可以由用户手动选择。我无法让覆盖工作。

目前,我主要关注将 locals() 或 globals() 设置为正确的值,但如下所示。这不起作用。

我的代码有两个重要部分:首先是 Main 函数,负责创建模型的所有工作。它有很多变量,如图所示:Wave_height

def Main(loopname, loopvalue = 0):

    Wave_height = 2 #m
    # And_many_other_characteristics

    # redefine one single variable name
    vars()[loopname] = loopvalue
    globals()[loopname] = loopvalue
    locals()[loopname] = loopvalue
    print (Wave_height)

    return_info = 1 ## rows of code i dont want to bother you with ##

    return(return_info)

if __name__ == "__main__":
    Main("testname", 0)

对于敏感性分析,我希望所有变量都保持不变,除了一个变量。假设我想改变 Wave_height。我想做如下代码:

import Main
import numpy as np

loopname = "Wave_height"
loopvalue = [1,2,3]

max_z_displacement = np.zeros(len(loopvalue))

for i in range (len(loopvalue)):
    return_info = Main.Main(loopname, loopvalue[i])
    max_z_displacement[i] = return_info[2]

目前打印如下:

2

我希望得到的结果是:

1

我想避免在 def-row 中使用 50 个不同的变量,因为那样不会使其易于使用。

【问题讨论】:

  • 代替动态变量,使用包含所有参数的字典,并传递字典键。
  • 感谢您的帮助,但是使用它超出了我目前对python的理解水平。我在网上多次读到动态变量是一个坏主意,但在我的情况下,它是“快速而肮脏”的方法来获得我想要获得的东西。你有没有建议如何在不需要使用完整字典的情况下提供所需的结果?
  • 您尝试的方法比使用字典高级得多,而且几乎可以肯定是错误的方法。
  • 那么我将如何使用字典从主函数外部获取单个参数的所需更改?如果我可以将变量的名称作为字符串的直接输出,我就可以解决了。这就是为什么我认为我的方法很容易实现。
  • 使用params[loopname] 而不是globals()[loopname],其中params 是保存参数的变量。也不需要str('{}'.format(loopname))loopname 已经是一个字符串。

标签: python variables global local


【解决方案1】:

为了让被调用的函数看起来更自然,将参数打包到一个没有特征的对象中:

class Parameters(object):
  def __init__(self,**attr): vars(self).update(attr)
def calc(**over):
  p=Parameters(Wave_height=2,…)
  vars(p).update(over)
  do_stuff(p.Wave_height,…)
  do_more(p.other_data)
  …

for h in heights:
  calc(Wave_height=h)
  calc(**{"Wave_height":h})  # to choose parameter dynamically

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-20
    • 2013-11-25
    • 2016-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多