首页 文章

参数的默认值[重复]

提问于
浏览
0

可能重复:Python中的“最小惊讶”:可变默认参数

考虑以下功能:

def foo(L = []):
  L.append(1)
  print L

每当我调用foo时,它将打印一个包含比以前更多元素的新列表,例如:

>>> foo()
[1]
>>> foo()
[1, 1]
>>> foo()
[1, 1, 1]

现在考虑以下功能:

def goo(a = 0):
  a += 1
  print a

多次调用时,我们得到以下图片:

>>> goo()
1
>>> goo()
1
>>> goo()
1

即每次通话都不会打印出更大的值 .

这种看似不一致的行为背后的原因是什么?
另外,如何在第一个例子中证明反直觉行为的合理性,为什么函数在调用之间保持状态?

1 回答

  • 1

    定义函数时,将对默认参数求值一次 . 因此,每次调用函数时都会得到相同的 list 对象 .

    每次调用第二个函数时,你也会得到相同的 0 对象,但由于 int 是不可变的,当你添加 1 时,新的对象需要被绑定到

    >>> def foo(L = []):
    ...   print id(L)
    ...   L.append(1)
    ...   print id(L)
    ...   print L
    ... 
    >>> foo()
    3077669452
    3077669452
    [1]
    >>> foo()
    3077669452
    3077669452
    [1, 1]
    >>> foo()
    3077669452
    3077669452
    [1, 1, 1]
    

    VS

    >>> def foo(a=0):
    ...   print id(a)
    ...   a+=1
    ...   print id(a)
    ...   print a
    ... 
    >>> foo()
    165989788
    165989776
    1
    >>> foo()
    165989788
    165989776
    1
    >>> foo()
    165989788
    165989776
    1
    

相关问题