2013-04-23 175 views
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從函數返回列表

在Python中,我不知道如何返回列表發生。所以我不知道這是否會起作用。 列表'a'已在函數內部創建。一旦函數的作用域結束,它會被銷燬嗎?如果是的話,可能的解決方法是什麼?

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

+2

你爲什麼不試試呢? – poke 2013-04-23 16:20:15

回答

1

是的,它會工作。前進!

Python是一種垃圾收集語言;運行時需要處理內存釋放,所以你不必擔心它。只要需要價值,它就不會被破壞。有關更多信息,請參閱Python Garbage Collection。摘錄:

Python的內存分配和釋放方法是自動的。 用戶不需要手動預分配或釋放內存,因爲在使用C或 C++等語言的動態內存分配時必須使用該內存。 Python對內存分配參考 計數和垃圾收集使用兩種策略。 ©Digi International,Inc.,www.digi.com

+0

是的。我將其添加爲答案的一部分。 – 2013-04-23 16:24:19

+0

對不起,壓力真的會把你帶走。對於刪除上面的評論也很抱歉。我沒有刷新,我以爲你沒有回答。 – tMJ 2013-04-23 16:33:32

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是一樣的,所以它的同一個對象。

+0

不錯的答案,但上面的Ilmo Euro在你做之前說了同樣的事情;所以我把他的答案作爲接受。還是謝謝。 – tMJ 2013-04-23 16:35:37

+1

@tMJ你仍然可以[upvote](http://stackoverflow.com/faq#howtoask)有用的答案(包括接受的答案)。 – poke 2013-04-23 16:37:25