本文讲解 python 中函数间共享数据的正确方式,重点解决“如何将 func1 创建的列表传递给 func2 并修改其内容”的常见误区,强调返回值传递与可变对象引用的本质区别。
在 Python 中,函数无法直接“保存”局部变量供其他函数隐式访问——局部变量的作用域严格限定在定义它的函数内部。你提供的代码中,func1 内部重新赋值 my_list = [...],这一操作并未修改传入的实参,而只是让形参 my_list 指向了一个新列表(原传入的空列表被丢弃)。因此,若不通过显式返回和接收,func2 根本无法访问到该数据。
✅ 正确做法是:让 func1 返回所需数据,由调用方显式赋值给变量,再将该变量作为参数传入 func2。这既符合 Python 的作用域规则,也清晰表达了数据流向。
以下是规范实现示例:
def func1(my_list, test1, test2):
# 忽略输入的 my_list,构造并返回新列表
return [{'name': 'Saeed', 'id': 1}, {'name': 'David', 'id': 2}]
def func2(name):
# 直接修改传入列表的嵌套字典(可变对象原地更新)
if name: # 防御性检查:确保列表非空
name[0]['id'] += 1
# 正确调用链
data = func1([], 1, 2)
# 获取 func1 生成的数据
func2(data) # 第一次修改:id → 2
func2(data) # 第二次修改:id → 3
print(data) # 输出: [{'name': 'Saeed', 'id': 3}, {'name': 'David', 'id': 2}]⚠️ 关键注意事项:
总结:Python 函数间通信应以明确的输入(参数)与输出(返回值) 为准则。通过返回值传递数据,是最清晰、最安全、最符合 Pythonic 哲学的方式。