2013-04-23 2 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. Я знаю, что могу легко вернуть такие вещи, как i, j, k, m - нормальные переменные.

+2

Почему бы вам просто не попробовать? – poke

ответ

1

Да, это сработает. Преуспевать!

Python - собранный мусором язык; среда выполнения заботится о освобождении памяти, поэтому вам не нужно беспокоиться об этом. Пока значение необходимо, оно не уничтожается. Для получения дополнительной информации см. Python Garbage Collection. Выдержка:

Метод распределения и освобождения памяти Python является автоматическим. Пользователь не должен предварительно выделять или освобождать память вручную, поскольку при использовании динамического выделения памяти в таких языках, как C или , C++ должен использоваться один . Python использует две стратегии для выделения памяти подсчет и сбор мусора. © Digi International, Inc., www.digi.com

+0

Да. Я добавил его в качестве части ответа. –

+0

Извините, стресс действительно берет вас. И извините за удаление вышеуказанного комментария. Я не освежился, и я думал, что ты не ответил. – tMJ

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 

Как вы можете видеть, что идентификатор объекта является то же самое, так что это тот же самый объект.

+0

Хороший ответ, но Ilmo Euro, выше, заявил то же самое, что и вы; поэтому я получил его ответ, как принято. Еще спасибо. – tMJ

+1

@tMJ Вы по-прежнему можете использовать [upvote] (http://stackoverflow.com/faq#howtoask) полезные ответы (в том числе и принятые). – poke

Смежные вопросы