有没有办法(hack)推动Python函数(def)通过引用返回结果,即使对于不可变类型也是如此?
提案申请(作为子程序交换):
def swap(a, b):
.....a,b = b,a
注意:
def swap(a, b):
.....return b,a
作为不问题答案的函数!
例如,有一个函数random.shuffle(a)可以就地工作。
我的想法是调用用Fortran / C ++编写的函数并通过Python调用它们。它确实有效,但也有缺点。
注:
“lambda
”和“def
”(作为函数)都存在以下问题:a, b = swap(a, b)
需要关注变量的顺序。在我的提案中(如果可能的话)子例程用作:swap(a, b)
,因此不需要关心变量的顺序。
答案 0 :(得分:4)
Python中的所有名称都是引用。不,没有可用的“out”引用(例如,在C ++意义上)。你需要传递一个可变对象,然后你可以在函数中改变它。但话说回来,返回新值应该是首选方式。
答案 1 :(得分:3)
不,这样的东西不存在,因为你得到了给定的对象作为参考,但如果你重新分配它,它将不会被改回。
在这种情况下,您必须使用可变容器(list,dict,带属性的对象)。
答案 2 :(得分:2)
在python中没有办法传递“写指针”。您可以传递对象和名称(因此被调用者可以使用例如setattr
),也可以传递列表和索引。没有上下文无关的“可修改单元格的地址”......只有名称或索引,但是也需要一个上下文(哪个名称空间,哪个数组)。
在一般情况下,如果你真的需要传递一个写指针,Python中的解决方案是传递一个“setter”函数,被调用者可以使用该函数来设置值。
例如:
def foo(setter):
setter(42)
def bar():
x = [1,2,3,4]
def setFirst(value):
x[0] = value
foo(setFirst)
print x[0] # --> 42