如何重写将默认输入更改为不这样做的类函数?

How do I rewrite a class function that mutates default input to not do so?

提问人:user2415706 提问时间:6/9/2020 更新时间:6/10/2020 访问量:18

问:

对于下面的代码,add_item 中的清单绑定到函数,如下所述:

“最小惊讶”和可变默认参数

class Person:
    def __init__(self, name: str, inventory: List[Item] = []):
        self.name = name
        self.inventory = inventory

    def add_item(self, item: Item):
        self.inventory.append(item)

所以这是发生的事情:

Dave.add_item(Book) # has Book
Mary.add_item(Apple) # has Book and Apple

所以我明白现在发生了什么,但我希望玛丽只有苹果,我不知道如何修复它才能工作。

进一步阅读该页面,我发现这样做是有效的,但这会阻止我将项目初始化到构建函数中的人,我想保留这些构造函数,因为我的add_item方法一次只添加一件事。self.inventory = []

python-3.x 对象 可变

评论

1赞 jasonharper 6/9/2020
不能在此处用作默认值,因为每个未指定自己的清单的实例都将共享该列表。将 default 设为 (或与参数的任何有用值不同的其他值),并有条件地将其替换为 (非共享空列表) 。[]None[].__init__()
0赞 user2415706 6/9/2020
所以喜欢:@jasonharper?def __init__(self, name: str, inventory: List[Item] = None): if inventory == None: self.inventory = [] else: self.inventory = inventory
1赞 jasonharper 6/9/2020
是的,这是这种情况的一般习语。

答:

0赞 user2415706 6/10/2020 #1

对于任何展望未来的人来说,这样的事情都是答案。感谢@jasonharper在评论中的帮助。

def __init__(self, name: str, inventory: List[Item] = None):         
    if inventory == None: 
        self.inventory = []         
    else: 
        self.inventory = inventory