繁体   English   中英

从python中的函数返回列表

[英]Returning lists from function in python

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分配了它的内存,否则我们不能通过在函数内部声明的引用(尤其是谈论数组)返回任何变量(其作用域在函数返回时终止,并且变量被销毁),除非我们使用new / malloc分配了其内存,然后返回指向数组的指针。

在蟒蛇,因为我不知道如何返回列表。 所以我不知道这是否行得通。 列表“ a”已在函数内部创建。 函数作用域结束后会销毁它吗? 如果是,那有什么可能的解决方法?

附言:我知道我可以轻松返回类似以下内容的内容: return [i,j,[k,m]]其中,i,j,k,m是常规变量。

是的,显然这会起作用。 Python不想让您担心内存管理。 如果您退货了,您可以并且应该期待它在那里。

这样做的原因是因为所有Python对象都分配在堆上(至少在CPython中)。 与C / C ++不同,在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是相同的,因此它是相同的对象。

是的,它将起作用。 前进!

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

Python的内存分配和释放方法是自动的。 用户不必像使用C或C ++这样的语言使用动态内存分配时那样,就必须手动预先分配或取消分配内存。 Python使用两种策略进行内存分配引用计数和垃圾回收。 ©Digi International,Inc.,www.digi.com

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM