可能以引用方式返回?

时间:2017-04-19 00:25:03

标签: python

这是一个简单的问题,但我在SO中找不到类似的问题。 无论如何都是以Python的形式返回? (也许是简单的黑客攻击。)

按参考说明回复:

def func(lst):
    return reference of lst[2] somehow

func([7, 8, 9, 10])        # returns 9
func([7, 8, 9, 10]) = 11   # lst is changed to [7, 8, 11, 10]

这种行为是否可以实现?可能有一些运营商超载?

C ++中这种用法的一个例子:Returning values by reference in C++

4 个答案:

答案 0 :(得分:2)

您应该做的只是返回2,然后将其用作您传入的列表的索引:

lyst = [7, 8, 9, 10]
def func(lst):
     # ...
     return 2

lyst[func(lyst)] = 11

可以创建一个对象,该对象封装对容器的引用以及特定元素的索引(或字典中的键):

class ElementRef(object):

    def __init__(self, obj, key):
        self.obj = obj
        self.key = key

    @property
    def value(self): return self.obj[self.key]

    @value.setter
    def value(self, value): self.obj[self.key] = value

然后你的功能如下:

 def func(lyst):
     # ...
     return ElementRef(lyst, 2)

您可以通过设置value属性来修改元素:

 func(lyst).value = 11

但是我没有看到很多有价值的东西而不仅仅是返回索引。特别是因为如果在使用之前将项目添加到列表中或从列表中删除项目,则该对象可能变得无用。显式返回一个索引会使这个问题成为一个明显的问题,但是如果你找回ElementRef,你可能会认为它包含某些不具备它的魔法。

答案 1 :(得分:0)

没有。 Python中的=重新绑定,因此您无法返回C ++样式的引用。并且Python切片副本,因此尝试返回list切片并分配给它并不会影响原始列表。

在没有极端措施的情况下,你能得到的最接近的是返回索引,并让调用者使用它来重新分配,例如:

def func(lst):
    return ... some computed index, e.g. 2 ...

mylist = [7, 8, 9, 10]
mylist[func(mylist)]        # Gets 9
mylist[func(mylist)] = 11   # mylist is changed to [7, 8, 11, 10]

这是可怕的代码;通常,您编写一个函数来返回一个新的,变异的list(保持原始状态不变)或者变异list到位(不返回任何内容,隐式None)。

答案 2 :(得分:0)

def func(lst):
    return reference of lst[2] somehow

如果你这样做:

def func(lst):
    return lst[2]

a = [1, 2, [3]]
b = func(a)

然后b 是对a[2]的引用。更准确地说,ba[2]都是对同一个列表对象([3])的引用。

因此,

b.append(4)
print(a)  # --> [1, 2, [3, 4]]

但你必须明白Python中的赋值运算符=不会改变左侧,它只会为右侧指定一个新名称。

答案 3 :(得分:0)

您也可以通过将赋值作为函数的参数传递来执行此类操作,因为Python不支持C ++通过引用返回值:

def func(lst, change_val = None):
    if change_val is not None:
        lst[2] = change_val
    return lst[2] 
lst = [7, 8, 9, 10]
print(func(lst))        # prints 9
print(func(lst, 11))  # prints 11; lst is changed to [7, 8, 11, 10]
print(lst) # prints [7, 8, 11, 10] since it was changed before