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

2024-05-03 07:17:51 发布

您现在位置:Python中文网/ 问答频道 /正文

在Python中,将可变对象设置为函数中参数的默认值是一个常见的错误。以下是从this excellent write-up by 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']

这种情况发生的原因是here

现在我要问的是:这个语法有好的用例吗?

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


Tags: 对象函数new参数错误语法thisitem
3条回答

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

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

但通常这类事情在类中做得更好,因为您可以使用其他属性来清除缓存等

也许您没有改变可变参数,但需要可变参数:

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=(),但我发现这不太清楚,也不太普遍。)

import random

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

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

相关问题 更多 >