修改元组内Job字段后数据自动还原的问题求助
问题原因
你遇到的问题是函数内部的变量赋值没影响到全局的x:
- 在
change_job函数里,你把参数x重新赋值为tuple(lst),但这个x是函数的局部变量,和全局作用域的x完全是两个独立变量。 - 你修改的只是函数内部的局部变量,全局的
x根本没被改动,所以调用show_info()时还是原始数据。
另外要注意:你的x本身是列表,不是元组——里面的元素才是元组,其实可以直接修改列表里的元素,不用额外转成元组再赋值。
修复方案
以下是三种可行的修复方式:
方式一:让函数返回修改后的数据,全局变量接收
这是最规范的做法,避免全局变量污染:
x = [('Rae', 31, 'Student'), ('Anna', 30, 'Nurse')] print(x) def show_info(): print(x) def change_job(newJob, data): lst = list(data) name = data[0][0] age = data[0][1] lst[0] = (name, age, newJob) print("List: ", lst[0]) # 返回修改后的列表(按需转成元组也可以) return lst newJob = input("What is your new job:") # 用全局x接收返回的修改后的数据 x = change_job(newJob, x) show_info()
方式二:直接修改传入的列表(利用列表可变性)
列表是可变对象,修改其内部元素会直接影响原对象,不需要重新赋值:
x = [('Rae', 31, 'Student'), ('Anna', 30, 'Nurse')] print(x) def show_info(): print(x) def change_job(newJob, data): name = data[0][0] age = data[0][1] # 直接修改列表的第一个元素 data[0] = (name, age, newJob) print("Modified element: ", data[0]) newJob = input("What is your new job:") change_job(newJob, x) show_info()
方式三:使用global声明(不推荐,易引发代码混乱)
如果一定要在函数里直接修改全局变量,可用global关键字声明:
x = [('Rae', 31, 'Student'), ('Anna', 30, 'Nurse')] print(x) def show_info(): print(x) def change_job(newJob): global x # 声明使用全局的x lst = list(x) name = x[0][0] age = x[0][1] lst[0] = (name, age, newJob) print("List: ", lst[0]) x = lst # 直接修改全局x print("Tuple: ", x[0]) newJob = input("What is your new job:") change_job(newJob) show_info()
运行效果(以方式二为例)
[('Rae', 31, 'Student'), ('Anna', 30, 'Nurse')] What is your new job:programmer Modified element: ('Rae', 31, 'programmer') [('Rae', 31, 'programmer'), ('Anna', 30, 'Nurse')]
内容的提问来源于stack exchange,提问作者evogamer
相关产品推荐
相关产品推荐

