首页 > 试题广场 >

考虑函数实现 def append_item(item, b

[单选题]
考虑函数实现 def append_item(item, bucket=[]): bucket.append(item); return bucket。关于该实现与修复方式,下列说法正确的是?
  • 该实现有缺陷:默认列表在函数定义时只创建一次,调用间会共享;应改为将默认值设为 None 并在函数体内创建新列表
  • 该实现没有问题,因为每次调用都会得到新的列表实例
  • 应将 bucket 声明为 global,这样每次调用都会互相隔离
  • 在函数尾部调用 bucket.clear() 即可彻底避免副作用

我们先分析一下题目中的函数:

def append_item(item, bucket=[]):
    bucket.append(item)
    return bucket

问题分析:
在 Python 中,默认参数值是在函数定义时计算的,而不是每次调用时计算。
因此 bucket=[] 这个空列表只会在函数定义时创建一次,之后所有不传入 bucket 参数的调用都会共享同一个列表对象。

例如:
append_item(1) # 返回 [1]
append_item(2) # 返回 [1, 2],而不是 [2]

修复方法:

将默认值设为 None,然后在函数内部判断并创建新列表:
def append_item(item, bucket=None):
    if bucket is None:
        bucket = []
    bucket.append(item)
    return bucket
答案:A ✅
发表于 今天 10:59:17 回复(0)