0

对不起,如果标题中的问题不是那么清楚,但我的空间有限,澄清......

在我的代码中,我有一个名为 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

我需要它是假的

4

2 回答 2

1

你可以这样解决你的问题:

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__()方法执行相同的操作。

于 2012-05-09T00:30:03.757 回答
0

如果您不完全了解它们的工作原理,可变的默认参数可能会导致麻烦。大多数初学者没有意识到,在处理定义时,关键字参数的默认值只计算一次。如果函数代码此后修改了这个对象,那么下一次使用默认对象的调用将看到修改后的值。

我用从http://holdenweb.com/files/IntroNotes.pdf#page=118开始的图片来解释这一点

顺便说一句,这些笔记是我的“Python 简介”课程的开源版本的草稿,因此我将不胜感激。

于 2012-05-09T05:48:10.253 回答