Python中的默认参数

时间:2013-06-07 20:18:46

标签: python default-parameters

我的类层次结构如下:

class ContextSummary(object):
    def __init__(self, id, db):
        self.db = db
        self.id = id

class GroupContextSummary(ContextSummary):
    def __init__(self, gId, db = {}):
        super(GroupContextSummary, self).__init__(gId, db)

我在单元测试中多次使用GroupContextSummary类而没有第二个参数。

groupSummary = GroupContextSummary(gId)

问题是db仍然保留以前的运行值。为了防止这种情况,我不得不使用

groupSummary = GroupContextSummary(gId, {})

或者我必须将init方法重新定义为

def __init__(self, gId, db = None):
    if db is None: db = {}
    super(GroupContextSummary, self).__init__(gId, db)

可能出现什么问题?

2 个答案:

答案 0 :(得分:1)

python中的默认值的常见问题。默认值在函数定义时分配,而不是在调用函数时分配。 一种解决方案是:

def func(a, b=None):
    if not b:
        b = {}

显然,如果None是b的合法参数,则不希望使用None作为b的默认值。哎呀。你已经知道了。

答案 1 :(得分:1)

每当您将可变对象传递给函数时,如果要对内容进行任何更改,应立即复制它。这不仅适用于__init__,也适用于任何功能。如果参数甚至没有默认值,也是如此。

您应该将ContextSummary中的行替换为:

self.db = db.copy()

我假设你不打算修改你传入的对象。如果函数的意图是修改它的参数,那么它有默认值吗?< / p>