Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何从外部重新定义函数中的可变变量? 编辑以考虑初始反馈_Python_Variables_Global_Local - Fatal编程技术网

Python 如何从外部重新定义函数中的可变变量? 编辑以考虑初始反馈

Python 如何从外部重新定义函数中的可变变量? 编辑以考虑初始反馈,python,variables,global,local,Python,Variables,Global,Local,为了对模型中的一些参数进行敏感性分析,我想覆盖并重新定义一个变量。此变量可由用户手动选择。我无法让覆盖工作 目前,我主要关注如何将局部变量()或全局变量()设置为正确的值,如下所示。这不起作用 我的代码有两个重要部分:首先是主函数,完成创建模型的所有工作。它有许多变量,其中一个显示为:波高 def Main(loopname,loopvalue=0): 波高=2米 #还有很多其他的特征 #重新定义一个变量名 vars()[loopname]=loopvalue globals()[loopnam

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

目前,我主要关注如何将局部变量()或全局变量()设置为正确的值,如下所示。这不起作用

我的代码有两个重要部分:首先是主函数,完成创建模型的所有工作。它有许多变量,其中一个显示为:波高

def Main(loopname,loopvalue=0): 波高=2米 #还有很多其他的特征 #重新定义一个变量名 vars()[loopname]=loopvalue globals()[loopname]=loopvalue 局部变量()[loopname]=loopvalue 打印(波高) return_info=1 35;#行我不想打扰你的代码## 退货(退货信息) 如果名称=“\uuuuu main\uuuuuuuu”: Main(“testname”,0) 对于敏感性分析,我希望所有变量都是常量,除了一个变量。假设我想改变波高。我想执行类似以下代码的操作:

importmain
将numpy作为np导入
loopname=“波浪高度”
loopvalue=[1,2,3]
最大位移=np.0(len(loopvalue))
对于范围内的i(len(loopvalue)):
return\u info=Main.Main(loopname,loopvalue[i])
最大位移[i]=返回信息[2]
目前,印刷品如下:

2
我希望结果是:

1

我希望避免在def行中使用50个不同的变量,因为这不会使其易于使用。

要使调用的函数看起来自然,请将参数打包到一个没有其他特性的对象中:

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

要使调用的函数看起来自然,请将参数打包到一个没有其他特征的对象中:

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

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