Python:引用变量(hack)

时间:2011-09-29 13:51:10

标签: python function immutability mutable subroutine

有没有办法(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) ,因此不需要关心变量的顺序

3 个答案:

答案 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