0
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”已在函数内创建。一旦函数的作用域结束,它会被销毁吗?如果是,有什么可能的解决方法?

PS 我知道我可以很容易地返回像return [i,j,[k,m]]i,j,k,m 是正常变量的这些东西。

4

2 回答 2

2

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

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

当然,您只需对其进行测试即可轻松验证此行为:

>>> 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 是相同的,所以它是同一个对象。

于 2013-04-23T16:27:42.160 回答
1

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

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

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

于 2013-04-23T16:21:16.187 回答