如何在Python中向函数传递大量变量?

Cur*_*urt 5 python pass-by-reference pass-by-value

我做科学编程,并且经常想要向用户显示提示和变量对,让他们编辑变量,然后用新变量进行计算.我经常这样做,我写了一个wxPython类来将这段代码移出主程序.您可以使用变量类型(字符串,浮点数,整数),提示符和变量的当前值为每个变量设置一个列表.然后将所有这些列表放在一个大的列表中,我的实用程序创建了一个整齐的wxPython面板,其中包含提示和可以编辑的当前值.

当我开始时,我只有一些变量,所以我会写出每个变量.

s='this is a string'; i=1; f=3.14
my_list=[ ['s','your string here',s], ['i','your int here',i], ['f','your float here'],]
input_panel = Input(my_list)

 # the rest of the window is created, the input_panel is added to the window, the user is
 # allowed to make  choices, and control returns when the user hits the calculate button

s,i,f = input_panel.results()     # the .results() function returns the values in a list
Run Code Online (Sandbox Code Playgroud)

现在我想将这个例程用于很多变量(10-30),这种方法正在破裂.我可以使用list.append()语句通过多行创建函数的输入列表.但是,当代码从函数返回时,我得到了这个庞大的列表,需要将其解压缩到正确的变量中.这很难管理,看起来很容易让输入列表和输出列表不同步.更糟糕的是,它看起来很糟糕.

使用额外信息将大量变量传递给Python中的函数的最佳方法是什么,以便可以对它们进行编辑,然后将变量返回以便我可以在程序的其余部分中使用它们?

如果我可以通过引用将变量传递给函数,那么用户可以更改它们,并且一旦程序从函数返回,我将使用这些值.我只需要在多行上构建输入列表,输入列表就不会与输出列表不同步.但Python不允许这样做.

我是否应该将大型列表拆分为较小的列表,然后将这些列表组合成大型列表以进入和退出函数?或者这只是添加更多地方来制造错误?

Ned*_*der 16

最简单的方法是创建一个类.该类将具有属性,而不是处理变量列表.然后你只使用该类的一个实例.


Dou*_*oug 9

我想到了两个不错的选择.

第一种是使用字典在一个地方收集所有变量:

d = {}
d['var1'] = [1,2,3]
d['var2'] = 'asdf'
foo(d)
Run Code Online (Sandbox Code Playgroud)

第二种是使用类来捆绑所有参数.这可能很简单:

class Foo(object):
    pass
f = Foo()
f.var1 = [1,2,3]
f.var2 = 'asdf'
foo(f)
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我更喜欢这个类而不是字典,只是因为你最终可以为类提供一个定义以使其更清晰,或者提供处理一些打包和解包工作的方法.