1

我有一个带有三个参数的函数,参数二和三具有默认值。参数三的默认值取决于参数一的属性。但是,我显然无法对“def”行中的参数一执行任何操作,因此我无法找到一种有效的方法来定义参数三的默认值。在 python 中执行此操作的标准方法是什么?

以下代码是我正在使用的。第一行会引发错误,因为我还没有真正定义“数据”。最好的解决方法是什么?

def stooge_sort(data, a = 0, b = len(data) - 1):
    if data[a] > data[b]:
        data[a], data[b] = data[b], data[a]
    if b + 1 - a >= 3:
        thirds = (b + 1 - a) / 3
        stooge_sort(data, a, b - thirds)
        stooge_sort(data, a + thirds, b)
        stooge_sort(data, a, b - thirds)
    return data
4

3 回答 3

3

请记住,默认参数仅在创建函数对象时计算一次,因此无法在其中放置这样的表达式。这与人们对分配可变值的默认参数的行为感到惊讶的原因相同。

通常的方法是选择一个你知道b永远不会的默认值。None通常是一个不错的选择。

def stooge_sort(data, a=0, b=None):
    if b is None:
        b = len(data) - 1
于 2013-04-18T02:49:54.100 回答
2

让变量默认为None,然后检查变量是否为None,如果是的话,把它改成你想要的值。

def stooge_sort(data, a = 0, b = None):
    if b is None:
        b = len(data) - 1
    if data[a] > data[b]:
        data[a], data[b] = data[b], data[a]
    if b + 1 - a >= 3:
        thirds = (b + 1 - a) / 3
        stooge_sort(data, a, b - thirds)
        stooge_sort(data, a + thirds, b)
        stooge_sort(data, a, b - thirds)
    return data
于 2013-04-18T02:50:38.190 回答
1

我相信常见的解决方法是简单地分配b一些默认值,例如None,然后根据data函数内部进行调整:

def stooge_sort(data, a = 0, b = None):
    if b is None:
        b = len(data) - 1
    # continue doing work
于 2013-04-18T02:50:00.123 回答