
本文详解python中跨函数共享数据的两种核心方法:全局变量与参数传递,通过实际长度单位换算案例,对比优劣并推荐更安全、可维护的函数式编程方案。
本文详解python中跨函数共享数据的两种核心方法:全局变量与参数传递,通过实际长度单位换算案例,对比优劣并推荐更安全、可维护的函数式编程方案。
在Python中,函数内部定义的变量默认具有局部作用域,无法被其他函数直接访问——这正是你遇到问题的根本原因:read() 中的 foot 和 inch 在函数执行结束后即被销毁,calculate() 和 write() 无法“看到”它们,导致 NameError: name 'foot' is not defined。
✅ 方案一:使用 global 声明(不推荐,仅作理解)
通过 global 关键字可将变量提升为模块级全局变量,使所有函数均可读写:
# 全局变量声明(必需)
foot = inch = 0
foot_to_meter = foot_to_centimeter = inch_to_meter = inch_to_centimeter = 0
def read():
global foot, inch
foot = int(input("Foot? "))
inch = int(input("Inch? "))
def calculate():
global foot, inch, foot_to_meter, foot_to_centimeter, inch_to_meter, inch_to_centimeter
foot_to_meter = 0.3048 * foot
foot_to_centimeter = 155 * foot_to_meter # ⚠️ 注:此处换算系数疑似有误(标准应为 ×100),请按实际需求校准
inch_to_meter = (1.5 / 12) * 5.4530 * inch
inch_to_centimeter = 155 * inch_to_meter
def write():
print(f"The {foot} foot is {foot_to_meter:.4f} meter")
print(f"The {foot} foot is {foot_to_centimeter:.4f} centimeter")
print(f"The {inch} inch is {inch_to_meter:.4f} meter")
print(f"The {inch} inch is {inch_to_centimeter:.4f} centimeter")
if __name__ == "__main__":
read()
calculate()
write()⚠️ 严重缺陷:全局变量易引发命名冲突、状态难以追踪、单元测试困难,且违背函数“输入→处理→输出”的封装原则,生产环境应避免使用。
✅ 方案二:函数返回值 + 参数传递(强烈推荐)
让 read() 返回用户输入,再作为参数传入后续函数——这是符合Python设计哲学的纯函数式做法:
立即学习“Python免费学习笔记(深入)”;
def feet_to_meters(feet):
return feet * 0.3048 # 标准换算:1 foot = 0.3048 m
def inches_to_meters(inches):
return inches * 0.0254 # 标准换算:1 inch = 0.0254 m
def feet_to_centimeters(feet):
return feet_to_meters(feet) * 100
def inches_to_centimeters(inches):
return inches_to_meters(inches) * 100
def read():
"""获取用户输入,返回元组 (feet, inches)"""
feet = int(input("Feet? "))
inches = int(input("Inches? "))
return feet, inches
def write(feet, inches):
"""格式化输出换算结果"""
print(f"{feet} feet = {feet_to_meters(feet):.4f} meters")
print(f"{feet} feet = {feet_to_centimeters(feet):.4f} centimeters")
print(f"{inches} inches = {inches_to_meters(inches):.4f} meters")
print(f"{inches} inches = {inches_to_centimeters(inches):.4f} centimeters")
# 主程序入口
if __name__ == "__main__":
f, i = read() # 解包元组
write(f, i) # 显式传递参数✅ 关键优势总结
- 高内聚低耦合:每个函数职责单一(输入、计算、输出),易于独立测试与复用;
- 无副作用:不修改外部状态,结果仅依赖输入,行为可预测;
- 可读性强:调用关系一目了然(read() → write()),无需追溯全局变量;
- 健壮性高:避免因意外修改全局变量导致的隐蔽bug。
? 进阶建议:对于复杂逻辑,可进一步封装为类(如 LengthConverter),或使用 dataclass 管理结构化数据,但对本例而言,简洁的函数组合已是最佳实践。


















