如何更改变量引用的对象?

时间:2011-12-19 20:08:58

标签: python

我有一个对象数组。我有兴趣编写一个函数,它将在列表中找到特定对象并返回对它的引用。

想象一下,以下代码片段是可能的:

list1 = [1,2,3]
def find(q):
    return q[0]
a = find(list1) 
a = 0 # This should change the object that "a" is referencing to.
print list1 # [0, 2, 3] is desired as result.

使用C ++中的指针很容易,但我怎么能在python中做呢?

3 个答案:

答案 0 :(得分:3)

要实现完全相同的语义可能是不可能的,但是使用get / set方法的代理可以实现类似的东西,虽然我不清楚究竟是什么以及为什么需要这个,所以最终的解决方案可能要复杂得多或简单,无论如何这是我的解决方案

def find(q):
    return Pointer(q, 0)

class Pointer(object):
    def __init__(self, alist, index):
        self.alist = alist
        self.index = index

    def get(self):
        return self.alist[self.index]

    def set(self, value):
        self.alist[self.index] = value

list1 = [1, 2, 3]     
p = find(list1)
p.set(0)
print list1

输出:

[0, 2, 3]

答案 1 :(得分:2)

函数currying是获得类似于by-reference语义的效果的一种方法:

list1 = [1,2,3]

def accessor(alist, index, value=None):
    if value is not None:
        alist[index] = value
    return alist[index]

def find(q):
    def access_first(value=None):
        return accessor(q, 0, value)
    return access_first

a = find(list1) 
print a() # This access the value that "a" references.
print a(0) # This changes the object that "a" is referencing to and returns its value.
print list1 # [0, 2, 3] is result.

输出:

1
0
[0, 2, 3]

答案 2 :(得分:0)

不可能,因为数字对象在Python中是不可变的。