抱歉,如果标题中的问题不是那么清楚,但我的空间有限,澄清...
在我的代码中,我有一个名为empDB的类,它创建了一个用于存储对象的空列表。
也向列表中添加新对象 我在empDB中创建了一个名为appendEmp的方法。 appendEmp 采用一个参数,该参数指定它将实例化的类,然后将其添加到列表中。如果未提供参数,则默认为类 Employee()。
这是我的问题
当我调用方法appendEmp时,它会在列表中创建新对象,但是当我尝试实例化列表中已有的对象时,它只会创建它的别名。我需要它每次创建一个新对象,以便我可以单独编辑列表中每个对象的属性。
这是我的代码片段:
class empDB:
def __init__(self, lst= []): #creates empty list
self.lst = lst
def appendEmp(self, emp=Employee()):
self.lst=self.lst+[emp]
基本上这就是现在发生的事情
>>> db=empDB()
>>> db.appendEmp()
>>> db.appendEmp()
>>> db[0] is db[1]
True
我需要它是假的
你可以这样解决问题:
class empDB:
def __init__(self, lst= []): #creates empty list
self.lst = lst
def appendEmp(self, emp=None):
if emp is None:
empt = Employee()
self.lst=self.lst+[emp]
该问题是由可变值分配为默认参数引起的。我用 None
替换了它,尽管如果你想接受这个值作为appendEmp()
的参数,你可以用其他东西替换它。
有关使用可变默认参数的危险的更多信息,您可以在此处阅读:Python的隐藏功能:可变默认参数的危险
附言。您可能还希望对__init__()
方法执行相同的操作。
如果您不完全了解可变的默认参数的工作原理,则可能会导致麻烦。大多数初学者没有意识到,在处理定义时,关键字参数的默认值只计算一次。如果函数代码此后修改此对象,则下次调用默认对象时将看到修改后的值。
我用图片来解释这一点,从 http://holdenweb.com/files/IntroNotes.pdf#page=118
顺便说一下,这些笔记是我的"Python 入门"课程的开源版本的草稿,所以我不胜感激任何反馈。