python - 如何解释这三个python代码的执行结果呢?

标签 python python-3.x

以下是三个Python代码:

======第1号=======

def foo(x, items=[]):
    items.append(x)
    return items

foo(1)  #return [1]
foo(2)  #return [1,2]
foo(3)  #return [1,2,3]

======第二号========

def foo(x, items=None):
    if items is None:
        items = []
    items.append(x)
    return items

foo(1)  #return [1]
foo(2)  #return [2]
foo(3)  #return [3]

======第3号=======

def foo(x, items=[]):
    items.append(x)
    return items

foo(1)    # returns [1]
foo(2,[]) # returns [2]
foo(3)    # returns [1,3]

对于代码 1,由于 items 的值没有提供,我认为它应该始终采用默认值[]。但参数items行为类似于静态变量,保留其值以供后续使用。 No.2 的代码按照我的预期执行:每次调用 foo 时,items取默认值None 。至于3号代码,我完全不知道。为什么上面三段代码的执行效果如此不同呢?你可以解释吗?谢谢。

PS:我使用的是 python 3.3.1

最佳答案

"Least Astonishment" and the Mutable Default Argument

这篇 stackoverflow 帖子回答了你的问题,因为 Python 函数是具有状态的对象,“item”命名参数保留多个调用之间的状态。

它有它的用途:

def calculate(a, b, c, memo={}):
    try:
        value = memo[a, b, c] # return already calculated value
    except KeyError:
        value = heavy_calculation(a, b, c)
        memo[a, b, c] = value # update the memo dictionary
    return value

如此处所述 http://effbot.org/zone/default-values.htm

关于python - 如何解释这三个python代码的执行结果呢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18370109/

相关文章:

python - 将时间增量列表添加到日期时间对象列表中?

python - 未找到类型 : '(schema, http ://www. w3.org/2001/XMLSchema,)

python - readline() 只读取第一行

python - 什么是类字节对象

python-3.x - 什么是 Python 3 `str.__getitem__` 计算复杂度?

python-3.x - 匹配器 GMS opencv

python - 创建 Django QuerySet 对象后修改它

python - 如何解决django HayStack、elasticsearch update_index错误?

python - Python 中数据类型之间的内存使用情况

python - 如何从 webdriver 访问 Firefox 缓存?