Python:如何传递对函数的引用

时间:2010-09-06 00:54:19

标签: python

如果参数是基本类型,如number,boolean

,则IMO python按值传递
func_a(bool_value):
    bool_value = True

不会更改外部bool_value,对吧?

所以我的问题是如何让bool_value更改在外部更改生效(通过引用传递?

3 个答案:

答案 0 :(得分:4)

您可以使用列表来包含inout变量:

def func(container):
    container[0] = True


container = [False]
func(container)
print container[0]

按值调用/按引用引用的误称是一个古老的争论。 CLU的call-by-sharing更准确地描述了Python的语义。有关详细信息,请参阅Fredrik Lundh的文章:

答案 1 :(得分:3)

Python(总是),就像Java(大多数)传递参数(并且,在简单赋值中,绑定名称)通过对象引用。没有“按价值传递”的概念,“引用变量”的概念也没有 - 只引用(有人通过说Python不强来表达这一点拥有“变量”...它有名称,它与值绑定 - 这就是所有可能发生的事情。)

可变对象可以有变异方法(其中一些看起来像运算符甚至赋值,例如a.b = c实际上意味着type(a).__setattr__(a, 'b', c),它调用的方法可能是变异的方法。

但是对简单名称的简单赋值(和传递参数,与简单的简单赋值完全相同)从来没有任何东西来处理任何变异方法。

与所涉及的类型无关,简单的barename赋值(以及相同的参数传递)只会绑定或重新绑定=左侧的特定名称,从不影响任何其他名称或任何对象无论如何。如果您认为类型与参数传递的语义(或者,相同地,简单地指定为裸名)有任何关系,那么您非常会出错。

答案 2 :(得分:2)

不可变类型不能,但如果您发送用户定义的类实例,列表或字典,则可以更改它并仅与一个对象保持一致。

像这样:

def add1(my_list):
    my_list.append(1)

a = []
add1(a)
print a

但是,如果你做了my_list = [1],你获得了一个新实例,失去了函数内部的原始引用,这就是为什么你不能只做“my_bool = False”并希望函数外面你的变量得到那个错误