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是正常变量。
答案 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