Python全局变量本地使用:如何在函数内用副本不修改全局
解决方法:使用列表副本避免修改全局变量
问题的核心在于:列表是可变对象,当你将其作为参数传入函数时,传递的是对象的引用而非副本。因此在change_thing中对parameter的修改会直接作用于原全局列表things,而字典中存储的也是这个列表的引用,所以字典内容也会跟着变化。
要实现仅在函数内使用本地副本而不修改全局变量,你需要在函数内创建列表的副本。常见的创建列表副本的方式有三种:
- 使用切片语法:
new_list = parameter[:] - 使用
list()构造函数:new_list = list(parameter) - 使用
copy模块的copy()方法:import copy; new_list = copy.copy(parameter)
修改后的代码示例
things = ['a', 'b'] dictionary = {} def save_thing(parameter): dictionary['First thing'] = parameter print('Dictionary BEFORE change_thing is run', dictionary) def change_thing(parameter): # 创建列表的本地副本 local_things = parameter[:] local_things.remove('a') # 这里操作local_things不会影响原列表 print('Local copy inside change_thing:', local_things) save_thing(things) change_thing(things) print('Dictionary AFTER change_thing is run', dictionary)
预期输出
Dictionary BEFORE change_thing is run {'First thing': ['a', 'b']} Local copy inside change_thing: ['b'] Dictionary AFTER change_thing is run {'First thing': ['a', 'b']}
额外建议:确保字典始终保留初始状态
如果担心后续其他操作修改全局things会影响字典内容,可以在save_thing函数中也存入列表的副本:
def save_thing(parameter): # 存入副本而非原列表的引用 dictionary['First thing'] = parameter[:] print('Dictionary BEFORE change_thing is run', dictionary)
这样即使全局things被修改,字典中的内容也会保持初始的['a', 'b']。
内容的提问来源于stack exchange,提问作者JohnG
相关产品推荐
相关产品推荐

