
本文讲解如何避免全局变量滥用,通过列表复制或重新赋值的方式,准确保留用户前一次输入的数据,实现多轮输入下的历史信息可追溯。
本文讲解如何避免全局变量滥用,通过列表复制或重新赋值的方式,准确保留用户前一次输入的数据,实现多轮输入下的历史信息可追溯。
在 Python 中,列表是可变对象,直接赋值(如 previous = information)只是创建了对同一内存地址的另一个引用,而非真正“保存副本”。因此,当后续修改 information 时,previous 也会随之改变——这正是你遇到的问题根源。
✅ 正确做法有以下两种(推荐后者):
方法一:显式复制列表
使用 .copy() 创建浅拷贝(适用于本例中纯字符串组成的列表):
previous = information.copy() # ✅ 真正独立的副本
方法二(更优):函数返回新列表,避免全局变量
彻底摒弃 global 声明,让 inputting() 函数专注采集并返回数据:
def inputting():
name = input("Enter your name\n")
subject = input("Enter your favorite subject\n")
height = input("Enter your height\n")
country = input("Enter your country\n")
return [name, subject, height, country]
# 主流程清晰可控
print("=== First input ===")
information = inputting()
previous = information.copy() # 或直接 previous = information[:]
print(f"Current info: {information}")
print("Do you want to enter new information? (y/n)")
if input().lower() == "y":
print("=== Second input ===")
information = inputting() # ✅ 重新绑定变量,不修改原列表
print(f"Updated info: {information}")
print("View previous info? (y/n)")
if input().lower() == "y":
print(f"Previous info: {previous}")
else:
print("Thank you.")
⚠️ 注意事项:
- 不要使用
previous = information直接赋值——这是引用共享,非数据备份; - 避免
global:它破坏函数封装性,导致状态难以追踪、调试困难、无法复用; - 若未来需支持多次输入(不止两次),可改用列表存储所有历史:
history.append(information.copy()); - 所有输入均为字符串,如需类型安全(如
height转为float),应在inputting()内做校验与转换。
总结:用返回值代替全局变量,用 .copy() 或重新赋值代替就地修改——代码更健壮、可读、可维护。











