Удалить экземпляр класса из памяти - PullRequest
0 голосов
/ 11 декабря 2018

В моей программе я создаю бесконечное количество экземпляров классов.сумма зависит от того, как долго работает программа.Однако мне не нужны экземпляры вообще после запуска определенного кода.Как я могу полностью удалить их из памяти?

Простой пример кода:

class Player:
    def __init__(self, color):
        self.color = color

for n in range(1000):
    p = Player('black')

Будет ли del p в этом случае полностью удалять этот экземпляр?

Ответы [ 3 ]

0 голосов
/ 11 декабря 2018

Python удалит их из памяти для вас, когда они больше не упоминаются.Если у вас есть Player экземпляры, которые ссылаются на другие Player экземпляры (например: p.teammates = [list of Players]), вы можете получить циклические ссылки, которые могут помешать их сборке мусора.В этом случае вам следует рассмотреть модуль weakref.

, например:

>>>sam = Player('blue')
>>>rob = Player('green')
>>>sam.team = [sam, rob]
>>>rob.team = [sam, rob]
>>> #sam and rob may not be deleted because they contain 
>>> #references to eachother so the reference count cannot reach 0
>>>del sam #del is a way to manually dereference an object in an interactive prompt. Otherwise the interpreter cannot know you won't use it again unlike when the entire code is known at the beginning.
>>>print(rob.team[0].color) #this prints 'blue' proving that sam hasn't been deleted yet
blue

, как нам это исправить?

>>>sam = Player('blue')
>>>rob = Player('green')
>>>sam.team = [weakref.ref(sam), weakref.ref(rob)]
>>>rob.team = [weakref.ref(sam), weakref.ref(rob)]
>>> #now sam and rob can be deleted, but we've changed the contents of `p.team` a bit:
>>> #if they both still exist:
>>>rob.team[0]() is sam #calling a `ref` object returns the object it refers to if it still exists
True
>>>del sam
>>>rob.team[0]() #calling a `ref` object that has been deleted returns `None`
None
>>>rob.team[0]().color #sam no longer exists so we can't get his color
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'NoneType' object has no attribute 'color'
0 голосов
/ 11 декабря 2018

В Python нет способа удалить экземпляр.Вместо этого вы можете удалить ссылки на экземпляр, и как только они исчезнут, объект будет возвращен.

0 голосов
/ 11 декабря 2018

В этом случае del p удалит только ссылку на объект Player, чтобы впоследствии его мог собрать сборщик мусора.

Тем не менее, это также происходит, когда выходит за рамки.

В большинстве повседневных Python нет необходимости использовать явные del операторы.

...