Создает ли на лету создание и возврат в функцию утечки памяти в Python? - PullRequest
2 голосов
/ 10 ноября 2010

Если я создаю список в функции python и возвращаю его вызывающей стороне, как сборка мусора работает в этом списке? Нужно ли что-то делать, чтобы предотвратить утечку памяти?

Например:

#!/usr/bin/python

import random

class Example:
    def f1(self):
        list = []
        len = random.randint(0, 30)
        for i in range (0, len):
                list.append(random.randint(0, 65536))
        return list


random.seed(None)

e = Example()
while (1):
    l = e.f1()

Это приведет к утечке памяти? Имеет ли «список» в f1 () соответствующий счетчик ссылок? Должен ли вызывающий метод f1 () что-либо делать, чтобы предотвратить утечку памяти? Должен ли вызывающий сделать del () в списке или что-то еще?

Ответы [ 2 ]

6 голосов
/ 10 ноября 2010

Здесь нет утечки памяти. Список, присвоенный l, является списком , аналогичным , который генерируется в функции. Python передает объекты, а не ссылки или значения.

Python отслеживает ссылки на этот список: на каждой итерации цикла while создается новый список и присваивается l. Это приводит к тому, что предыдущая ссылка больше не имеет ссылок, поэтому она будет удалена.

2 голосов
/ 10 ноября 2010

в python это все автоматически ... большую часть времени вам не нужно беспокоиться о сборке мусора ...

в этом случае функция создает список и возвращает его.затем вы присваиваете его l.

как только вы присваиваете значение непустому var, первое значение просто выбрасывается, утечек памяти нет, вам не нужно использовать del ..

это круто, не правда ли?:)

...