2013-04-23 4 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++에서 C/C++의 함수 (함수에 대한 범위가 끝나고 변수가 파괴됨) 내에서 선언 된 변수 (특히 배열에 대한 참조)는 C/C++에서 반환 할 수 없습니다 new/malloc을 사용하여 할당 된 다음 포인터를 배열에 반환합니다.파이썬에서 함수의 목록 반환 목록

파이썬에서는 목록 반환이 어떻게되는지 알지 못합니다. 그래서 이것이 효과가 있을지 모르겠다. 'a'목록이 함수 내에 작성되었습니다. 함수 범위가 끝나면이 함수가 파괴됩니까? 그렇다면 가능한 방법은 무엇입니까?

P. 나는이 같은 것을 쉽게 돌려 줄 수 있다는 것을 알고있다 return [i,j,[k,m]] 여기서 i, j, k, m은 보통 변수이다.

+2

왜 그냥 사용하지 않으시겠습니까? – poke

답변

1

예, 작동합니다. 어서가!

파이썬은 가비지 수집 언어입니다. 런타임은 메모리 할당 해제를 처리하므로 걱정할 필요가 없습니다. 가치가 필요하다면 파괴되지 않습니다. 자세한 내용은 Python Garbage Collection을 참조하십시오. 발췌 :

파이썬의 메모리 할당 및 할당 해제 방법은 자동입니다. 사용자는 이 C 또는 C++와 같은 언어로 동적 메모리 할당을 사용할 때 수동으로 메모리를 미리 할당하거나 할당을 해제 할 필요가 없습니다. 파이썬은 메모리 할당 참조 카운팅 및 가비지 수집에 대해 두 가지 전략을 사용합니다. © Digi International, Inc., www.digi.com

+0

예. 나는 그것을 대답의 일부로 추가했다. –

+0

죄송합니다. 스트레스는 정말 당신을 행복하게합니다. 그리고 위의 의견도 삭제 해 주셔서 죄송합니다. 나는 상쾌하지 않았고 당신이 대답하지 않았다고 생각했습니다. – tMJ

2

예, 분명히 작동합니다. 파이썬은 메모리 관리에 대해 걱정하지 않으려합니다. 당신이 뭔가를 반환한다면, 당신은 그것을 기대할 수 있고, 거기에 있어야한다고 기대할 수 있습니다.

모든 Python 개체가 적어도 CPython에서는 힙에 할당되어 있기 때문에이 방법이 효과가있는 이유입니다. 로컬 변수가 스택에 메모리를 얻고 함수가 범위를 벗어날 때 스택 메모리가 제거되는 C/C++과 달리 모든 것이 동적으로 할당됩니다. 그것은 마치 malloc 등을 사용하여 모든 것이 생성되는 것과 같습니다. 반면에 가비지 콜렉션은 더 이상 필요하지 않은 모든 객체의 메모리가 자동으로 해제되므로 아무 것도 걱정할 필요가 없습니다. 당신이 개체 ID가 동일 볼 수 있듯이

>>> 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 

, 그래서 동일한 개체입니다 :

그리고 물론

, 당신은 쉽게 그냥 테스트하여이 동작을 확인할 수 있습니다.

+0

좋은 답변이지만 위의 Ilmo Euro는 당신이하기 전에 똑같은 말을했습니다. 그래서 나는 그의 대답을 받아 들였다. 고마워. – tMJ

+1

@tMJ 유용한 답변 (허용 된 답변 포함)도 여전히 [upvote] (http://stackoverflow.com/faq#howtoask) 할 수 있습니다. – poke