当前位置:首页python > 正文

Python 基础知识:函数参数中的可变对象陷阱

作者:野牛程序员:2025-12-22 09:16:41python阅读 2005
Python 基础知识:函数参数中的可变对象陷阱
# /*
# Python 基础知识:函数参数中的可变对象陷阱
# --------------------------------------------------------
# 功能:
# 1) 解释可变对象作为默认参数的风险
# 2) 展示列表在函数调用过程中被意外共享的情况
# 3) 提供正确写法,避免参数污染
# */

print("示例一:可变对象作为默认参数引发的问题")

def add_item_wrong(val, lst=[]):  # 默认参数为可变对象(陷阱)
    lst.append(val)
    return lst

print(add_item_wrong(1))
print(add_item_wrong(2))
print(add_item_wrong(3))    # 被动累积内容

print("-" * 40)

print("示例二:默认参数仅计算一次,导致同一列表被共享")

def show_default_list(lst=[]):
    print("当前列表:", lst)
    lst.append("X")

show_default_list()
show_default_list()
show_default_list()

print("-" * 40)

print("示例三:正确写法,避免共享可变对象")

def add_item_right(val, lst=None):
    if lst is None:         # 使用 None 触发创建新列表
        lst = []
    lst.append(val)
    return lst

print(add_item_right(1))
print(add_item_right(2))
print(add_item_right(3))    # 不会共享内容

print("-" * 40)

print("示例四:参数中传入可变对象时的真实引用行为")

nums = [10, 20]

def modify_list(data):
    data.append(30)          # 直接修改传入对象

modify_list(nums)
print("列表被修改:", nums)


# /*
# 输出示例(简化版):
# 示例一(陷阱):
# [1]
# [1, 2]
# [1, 2, 3]
# ----------------------------------------
# 示例二:
# 当前列表: []
# 当前列表: ['X']
# 当前列表: ['X', 'X']
# ----------------------------------------
# 示例三(正确写法):
# [1]
# [2]
# [3]
# ----------------------------------------
# 示例四(引用行为):
# 列表被修改: [10, 20, 30]
#
# 要点总结:
# 1) 默认参数在函数定义阶段只计算一次;
# 2) 默认参数若为列表、字典等可变对象,会在多次调用间被共享;
# 3) 共享可变对象会引发内容累积、意外污染等问题;
# 4) 避免方式:将默认参数设为 None,在函数内部创建新对象;
# 5) 函数接收到的可变对象参数为真实引用,函数内部的修改会影响外部对象;
# 6) 静态默认值应选择不可变对象(整数、字符串、元组等)更为安全。
# */


野牛程序员教少儿编程与信息学奥赛-微信|电话:15892516892
野牛程序员教少儿编程与信息学竞赛-微信|电话:15892516892
  • Python 基础知识:函数参数中的可变对象陷阱
  • 相关推荐

    最新推荐

    热门点击