【问题标题】:Returning lists from function in python从python中的函数返回列表
【发布时间】:2013-04-23 16:16:43
【问题描述】:
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”已在函数内创建。一旦函数的作用域结束,它会被销毁吗?如果是,有什么可能的解决方法?

附:我知道我可以轻松地返回像 return [i,j,[k,m]] 这样的东西,其中 i,j,k,m 是普通变量。

【问题讨论】:

  • 你为什么不试试看?

标签: list python-3.x


【解决方案1】:

是的,显然这会起作用。 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 相同,所以它是同一个对象。

【讨论】:

  • 不错的答案,但是上面的 Ilmo Euro 在您之前说过同样的话;所以我将他的回答视为已接受。还是谢谢。
  • @tMJ 您仍然可以upvote 提供有用的答案(也包括已接受的答案)。
【解决方案2】:

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

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

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

【讨论】:

  • 是的。我将其添加为答案的一部分。
  • 抱歉,压力真的会带走你的优点。很抱歉也删除了上述评论。我没有刷新,我以为你没有回复。
猜你喜欢
  • 2017-06-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多