可变函数参数默认值的良好用法?

将可变对象设置为函数中参数的默认值是常见的错误。 以下是David Goodger撰写的优秀文章的一个例子:

>>> def bad_append(new_item, a_list=[]):
        a_list.append(new_item)
        return a_list
>>> print bad_append('one')
['one']
>>> print bad_append('two')
['one', 'two']

这种情况发生的原因就在这里。

现在对于我的问题: 这种语法是否有很好的用例?

我的意思是,如果每个遇到它的人都犯了同样的错误,那么调试它,理解这个问题并从中尝试避免它,那么这种语法有什么用处呢?


您可以使用它在函数调用之间缓存值:

def get_from_cache(name, cache={}):
    if name in cache: return cache[name]
    cache[name] = result = expensive_calculation()
    return result

但通常这样的事情可以通过一个类来完成,因为您可以拥有额外的属性来清除缓存等。


import random

def ten_random_numbers(rng=random):
    return [rng.random() for i in xrange(10)]

使用random模块,实际上是一个可变单例,作为其默认的随机数生成器。


也许你不会改变可变参数,但确实需要一个可变参数:

def foo(x, y, config={}):
    my_config = {'debug': True, 'verbose': False}
    my_config.update(config)
    return bar(x, my_config) + baz(y, my_config)

(是的,我知道你可以在这个特殊情况下使用config=() ,但是我觉得不那么清晰,不太一般。)

链接地址: http://www.djcxy.com/p/4873.html

上一篇: Good uses for mutable function argument default values?

下一篇: Why does the Book say I must cast malloc?