
本文讲解如何在 python 中让一个函数生成的数据被另一个函数安全访问和修改,重点介绍返回值传递、引用传递机制及常见误区。
在 Python 中,函数之间不能直接访问彼此的局部变量。例如,func1 内部重新赋值 my_list = [...] 并不会影响调用时传入的原始列表(因为该赋值操作只是改变了局部变量 my_list 的绑定对象),而 func2 也无法凭空获取 func1 创建的数据——除非通过明确的数据传递机制。
✅ 正确做法是:让 func1 返回所需数据,再将返回值作为参数传给 func2。这是最清晰、可维护且符合 Python 哲学的方式:
def func1(my_list, test1, test2):
# 注意:此处创建新列表并返回,不依赖输入参数 my_list
return [{'name': 'Saeed', 'id': 1}, {'name': 'David', 'id': 2}]
def func2(data_list):
if data_list: # 防御性检查
data_list[0]['id'] += 1
# 使用示例
result = func1([], 1, 2) # 获取 func1 生成的数据
func2(result) # 修改第一个元素的 id
func2(result) # 再次修改
print(result) # 输出: [{'name': 'Saeed', 'id': 3}, {'name': 'David', 'id': 2}]⚠️ 关键注意事项:
- 不要依赖“隐式共享”:func1 中对形参 my_list 的重新赋值(如 my_list = [...])不会改变外部变量,它仅重绑了局部名称。
- 列表是可变对象,但传递的是引用:当 func2 接收 result 后,它操作的是同一份内存中的字典对象,因此 data_list[0]['id'] += 1 确实会持久化修改。
- 若需避免副作用,可在 func2 中使用深拷贝(copy.deepcopy()),或让 func2 返回新结构而非就地修改。
- 命名建议:参数名应体现语义(如 data_list 比 name 更准确),避免误导。
总结:Python 函数间通信应以显式返回 + 显式传参为基本原则。既保障逻辑清晰、易于调试,也符合函数式编程中“输入→处理→输出”的设计范式。
立即学习“Python免费学习笔记(深入)”;










