如果参数是基本类型,如number,boolean
,则IMO python按值传递func_a(bool_value):
bool_value = True
不会更改外部bool_value
,对吧?
所以我的问题是如何让bool_value
更改在外部更改生效(通过引用传递?
答案 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”并希望函数外面你的变量得到那个错误