美文网首页
Python函数参数:列表作为默认值,一个隐藏的陷阱!

Python函数参数:列表作为默认值,一个隐藏的陷阱!

作者: 数据人阿多 | 来源:发表于2025-08-04 19:27 被阅读0次

背景

在Python编程中,函数参数的设计直接影响代码的健壮性和可预测性。一个需要警惕的实践是:避免将可变对象(尤其是列表)作为函数参数的默认值。这样做可能导致极其隐蔽且令人困惑的bug

小编环境

import sys

print('python 版本:',sys.version.split('|')[0])
#python 版本: 3.11.11

现象:一个诡异的“记忆”功能

想象你设计了一个函数,用来记录新添加的学生姓名到某个班级列表。如果列表为空,则创建一个新列表:

def add_student(name, student_list=[]):
    student_list.append(name)
    return student_list

# 第一次调用:添加Alice
class1 = add_student("Alice")
print(class1)  # 输出: ['Alice'] 

# 第二次调用:添加Bob
class2 = add_student("Bob")
print(class2)  # 输出: ['Alice', 'Bob'] 

问题来了: 第二次调用add_student("Bob")时,并没有传递student_list参数,期望的是生成一个只包含"Bob"的新列表。但结果却包含了第一次添加的"Alice"!这个函数似乎“记住了”之前的调用

原因揭秘:列表是引用类型

要理解这个问题的本质,必须明白Python中变量的工作方式:

  1. 列表是引用类型
    在Python中,变量存储的是对象的引用(内存地址),而不是对象本身。当你将一个列表赋值给变量时,实际上是在创建一个指向列表对象的引用。

  2. 默认参数的创建时机
    当Python解释器遇到函数定义时,它会立即创建默认参数对象。对于列表这样的可变对象,这意味着只有一个列表对象被创建,并且这个对象会持续存在于整个程序的生命周期中。

  3. 函数调用时的陷阱
    当你多次调用函数而不提供参数时,Python不会创建新的列表,而是重复使用同一个默认列表对象。因为列表是可变的,每次对它的修改都会永久改变这个共享对象。

  4. 引用传递的后果
    由于函数操作的是指向同一个列表对象的引用,所有使用默认参数的调用实际上都在操作同一个物理列表。这就是为什么数据会"神奇地"在函数调用之间保留下来

解决方案:使用不可变默认参数

正确的做法是使用 None 作为哨兵值

def add_item(item, items=None):
    if items is None:
        items = []  # 每次调用都创建新列表
    items.append(item)
    return items

历史相关文章


以上是自己实践中遇到的一些问题,分享出来供大家参考学习,欢迎关注微信公众号:DataShare ,不定期分享干货

相关文章

  • Python开发人员犯下的10个最常见的错误

    1 滥用表达式作为函数参数的默认值 python允许通过为函数提供默认值来指定函数参数的,但是当默认值是可变的时,...

  • c++函数特性

    函数重载,参数默认值,内联函数 重载:函数名相同,参数列表不同,作用域相同。 参数默认值:参数默认值必须从最后开始...

  • 十个Python码农最容易犯的错误, 十个中有九个程序猿躲不过!

    1、滥用表达式作为函数参数默认值 Python允许开发者指定一个默认值给函数参数,虽然这是该语言的一个特征,但当参...

  • 10个最容易犯的Python开发错误

    1、滥用表达式作为函数参数默认值 Python允许开发者指定一个默认值给函数参数,虽然这是该语言的一个特征,但当参...

  • Python 34

    函数参数的灵活使用 1.默认值参数 2.列表参数 1)默认值参数 有参数的函数而言,必须在调用时制定参数 #给函数...

  • python 偏函数

    python偏函数的概念是:使用functools.partical将原函数及默认值作为参数传入,然后得到一个新的...

  • Python函数、对象几个知识点

    函数 一、参数 Python的函数参数可以定义默认值,当调用者没有提供参数时,函数在执行过程中用默认值设置该参数。...

  • 5-2 深入函数-定义与调用

    1.默认值参数 在Python中,可以在声明函数的时候,预先为参数设置一个默认值,当调用函数,如果某个参数具有默认...

  • python函数

    python函数 什么是函数 函数语法 调用函数 函数参数形参与实参传参指定参数传参参数默认值可变参数参数解包参数...

  • Python 程序员最常犯的十个错误

    常见错误1:错误地将表达式作为函数的默认参数 在Python中,我们可以为函数的某个参数设置默认值,使该参数成为可...

网友评论

      本文标题:Python函数参数:列表作为默认值,一个隐藏的陷阱!

      本文链接:https://www.haomeiwen.com/subject/gbvqojtx.html