首页 > 解决方案 > 在python中重新分配变量时如何主动释放/删除所有关联对象

问题描述

重新分配变量时,python 似乎不会删除关联的对象。看看下面的代码:

from dataclasses import dataclass

@dataclass
class Transaction(object):
    amount : int
    new_balance : int
    description : str

class Account(object):
    def __init__(self, acc_name, balance, transactions = []):
        self._acc_name = acc_name
        self._balance = balance
        self._transactions = transactions # list of Transaction objects

    def add_income(self, amount, description = "income"):
        self._balance += amount
        self.transactions.append(Transaction(
            amount=amount,
            new_balance=self._balance,
            description=description
            ))
        
    @property
    def transactions(self):
        return self._transactions



acc = Account("User",100)
acc.add_income(100)
print(acc.transactions)

acc = None

acc = Account("User",100)
print(acc.transactions)

输出是

[Transaction(amount=100, new_balance=200, description='income')]
[Transaction(amount=100, new_balance=200, description='income')]

因此,即使我重新分配了变量,我们也可以看到 Transaction 对象仍然存在。在遇到这种行为时,当我想在 unittest 的 setUp 方法中为我的测试创建一个新实例时。为什么会这样?删除“父”对象时是否有可能删除“子”对象?在这种情况下,最佳做法是什么?

标签: python

解决方案


问题在于默认值transactions; 它在类的所有实例之间共享。

通常的成语是

def __init__(..., transactions=None) :
    if transactions is None:
        transactions = []
   ...

推荐阅读