CodeWalk

Python 中的 Mutable Default Argument 陷阱

作者:我还是少年 · 2026-05-30 12:55

为什么在类中使用可变对象作为类属性默认值也会遇到类似函数默认参数的问题?

回答

我还是少年

类属性在类定义时创建,所有实例共享同一个可变对象。

class Dog:
    tricks = []  # 类属性,所有实例共享

    def __init__(self, name):
        self.name = name

    def add_trick(self, trick):
        self.tricks.append(trick)

d1 = Dog('Fido')
d2 = Dog('Buddy')
d1.add_trick('roll over')
print(d2.tricks)  # ['roll over'] <- 共享!

正确做法:在 __init__ 中创建实例属性

class Dog:
    def __init__(self, name):
        self.name = name
        self.tricks = []  # 每个实例独立

    def add_trick(self, trick):
        self.tricks.append(trick)

类似的陷阱

# 函数默认参数陷阱
class MyClass:
    def __init__(self, items=[]):  # 不要这样做!
        self.items = items