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

