从python中的函数返回列表

时间:2013-04-23 16:16:44

标签: list python-3.x

def _pawnHit(state, user, y):
    not_user = _notUser(user)
    hit = 0
    a=[]

    for coordinate in y[1]:
        if(state.whichUserProper(coordinate[0], coordinate[1]) == not_user):
            hit = 1
            a.append(coordinate)

    if(hit==1):
        return [a,True]

    for coordinate in y[0]:
        if(state.whichUserProper(coordinate[0],coordinate[1] == 7)):
            a.append(coordinate)
        else:
            break

    return [a,False]

在C / C ++中,我们不能通过引用返回任何变量(特别是谈论数组)在函数内声明(它的作用域在函数返回并且变量被销毁时结束),除非它的内存是使用new / malloc分配的,然后也是我们返回指向数组的指针。

在python中,因为我不知道列表的返回是如何发生的。所以我不知道这是否有效。 列表'a'已在函数内创建。一旦函数的范围结束,它会被销毁吗?如果是的话,有什么方法可以解决它?

P.S。我知道我可以很容易地返回像return [i,j,[k,m]]这样的东西,其中i,j,k,m是正常变量。

2 个答案:

答案 0 :(得分:2)

是的,显然这会奏效。 Python不想让你担心内存管理。如果你退回了某些东西,你可以而且应该期待它在那里。

这样做的原因是因为所有Python对象都在堆上分配(至少在CPython中)。与C / C ++不同,其中局部变量在堆栈上获取内存,并且当函数超出范围时删除堆栈内存,所有内容都是动态分配的。这就像使用malloc等创建所有内容一样。另一方面,垃圾收集确保自动释放不再需要的所有对象的内存,因此您永远不必担心任何事情。

当然,您可以通过测试来轻松验证此行为:

>>> def giveMeAList(n):
        l = list(range(n)) # create a list with n values
        print(id(l)) # print the id of the list object
        return l
>>> x = giveMeAList(100)
47264136
>>> id(x)
47264136
>>> len(x)
100

正如您所看到的,对象ID是相同的,因此它是相同的对象。

答案 1 :(得分:1)

是的,它会起作用。来吧!

Python是一种垃圾收集语言;运行时负责内存释放,因此您不必担心它。只要需要一个值,它就不会被破坏。有关更多信息,请参阅Python Garbage Collection。摘录:

  

Python的内存分配和释放方法是自动的。该   用户不必手动预分配或释放内存   必须在C或C等语言中使用动态内存分配   C ++。 Python使用两种策略进行内存分配引用   计数和垃圾收集。   ©Digi International,Inc.,www.digi.com