Python中reverse()函数困惑:为何赋值后反转会同时改变两个列表?
问题解答
核心原因:Python列表是可变对象,赋值传递的是引用
在Python中,列表属于可变对象。当你执行temp = x这种赋值操作时,并没有创建新的列表副本,而是让temp和x两个变量指向内存中同一个列表对象——它们其实是同一个列表的不同“别名”。
所以调用temp.reverse()时,本质是对这个共享的列表执行反转操作,x作为同一个列表的别名,内容自然会跟着改变。这就是你测试代码里print(temp)和print(x)输出完全相同的原因。
为什么maf函数对所有输入都返回True?
拆解你的maf函数执行逻辑:
temp = x让temp和x指向同一个列表;temp.reverse()直接修改了这个共享列表的内容,此时x的内容已经被反转;- 最后判断
temp == x,本质是在验证“同一个列表是否等于它自己”,这必然为True,和原列表是不是回文无关。
比如输入a = [17, 38, 10, 25, 72],反转后x变成[72,25,10,38,17],temp和x是同一个列表,所以相等返回True;而b是回文列表,反转后和原列表一致,当然也返回True。
如何修正这个问题?
如果想让temp成为原列表的独立副本,而非引用,常用方法有三种:
- 切片语法:
temp = x[:](切片会生成新的列表副本) list()构造函数:temp = list(x)copy模块:import copy; temp = copy.copy(x)
修正后的maf函数如下:
def maf(x): """ (list)->bool """ temp = x[:] # 创建原列表的独立副本 temp.reverse() return temp == x # 直接返回判断结果,简化代码
现在调用maf(a)会返回False,maf(b)返回True,符合预期。
内容的提问来源于stack exchange,提问作者momo123321
相关产品推荐
相关产品推荐

