可以通过引用返回?

Roc*_*lly 7 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]
Run Code Online (Sandbox Code Playgroud)

这种行为是否可以实现?可能有一些运算符重载?

C++中此用法的一个示例:在C++中通过引用返回值

kin*_*all 5

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

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

lyst[func(lyst)] = 11
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

然后你的函数看起来像这样:

 def func(lyst):
     # ...
     return ElementRef(lyst, 2)
Run Code Online (Sandbox Code Playgroud)

您可以通过设置其value属性来修改元素,如下所示:

 func(lyst).value = 11
Run Code Online (Sandbox Code Playgroud)

但是我没有看到这比返回索引有什么价值。特别是因为如果在使用之前将项目添加到列表中或从列表中删除项目,则该对象可能变得无用。显式返回索引使这成为一个明显的问题,但是如果您返回一个索引,ElementRef您可能会认为它包含某种它没有的魔法。


Sha*_*ger 1

不,=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]
Run Code Online (Sandbox Code Playgroud)

但这是很糟糕的代码;通常,您会编写一个函数来返回一个新的、变异的list(保持原始不变)或list就地变异(隐式地不返回任何内容None)。