Python中函数内修改列表但外部未更新的问题求助
Python中函数内修改列表但外部未更新的问题求助
我最近遇到一个Python的小坑,想在函数里修改一个列表,但函数执行完后外面的原列表完全没变化,折腾了半天没搞懂,来请教大家!
我的简化代码是这样的:
def update_list(my_list): my_list = my_list + [4, 5] original_list = [1, 2, 3] update_list(original_list) print(original_list)
我做的尝试:
- 定义了一个接收列表参数的函数,想用
my_list = my_list + [4, 5]的方式给列表加元素 - 把已有的
[1, 2, 3]传入函数,以为这样就能修改原列表
我预期的结果:
调用函数后,原列表应该变成[1, 2, 3, 4, 5]
实际发生的情况:
函数调用完后,列表还是[1, 2, 3],函数里的修改完全没传到外部来...
嗨,我来帮你捋清楚这个问题!其实核心原因是你用的+操作符和赋值语句的逻辑问题:
- 当你在函数里写
my_list = my_list + [4,5]时,my_list + [4,5]会创建一个全新的列表,然后你把这个新列表的引用赋值给了函数内部的my_list变量。 - 但这个
my_list只是函数内部的局部变量,和外部的original_list已经彻底没关系了——相当于你在函数里给这个变量换了个新的“指向”,原列表的引用根本没被改动。
那怎么解决呢?给你三个实用的方法:
方法一:用列表的extend()方法(推荐,原地修改原列表)
extend()方法会直接在原列表的基础上追加元素,不会创建新列表,这样函数内的修改就会直接作用到外部的原列表上:
def update_list(my_list): my_list.extend([4, 5]) # 直接修改传入的列表对象 original_list = [1, 2, 3] update_list(original_list) print(original_list) # 输出 [1, 2, 3, 4, 5]
方法二:用+=操作符(原地扩展)
+=对于列表来说是原地修改操作,和extend()的效果类似,同样能直接改动原列表:
def update_list(my_list): my_list += [4, 5] # 原地扩展列表内容 original_list = [1, 2, 3] update_list(original_list) print(original_list) # 输出 [1, 2, 3, 4, 5]
方法三:返回新列表并重新赋值(不修改原列表的场景)
如果你需要保留原列表的数据,不想直接修改它,可以让函数返回新创建的列表,然后在外部把原变量重新赋值:
def update_list(my_list): return my_list + [4, 5] # 返回拼接后的新列表 original_list = [1, 2, 3] original_list = update_list(original_list) # 把新列表重新赋值给原变量 print(original_list) # 输出 [1, 2, 3, 4, 5]
总结一下:Python中列表是可变对象,但如果你在函数里给参数变量重新赋值(比如my_list = ...),就会切断和原对象的关联,必须用原地修改的方法,或者返回新对象再重新赋值,才能让外部看到变化。
内容来源于stack exchange
相关产品推荐
相关产品推荐

