为何Python函数内操作后列表未改变?两种场景对比疑问
为什么两个列表操作的结果不同?
核心原因很简单:重新赋值函数参数和修改参数指向的可变对象本身是两种完全不同的操作。
第一种情况:原列表未改变
看这段代码:
def test(nums): nums = list(set(nums)) nums = [1,2,3,4,1,2,3,4] test(nums) print(nums) # 输出 [1,2,3,4,1,2,3,4]
当调用test(nums)时,函数内部的局部变量nums一开始和外部的nums指向同一个列表对象。但nums = list(set(nums))这行代码做了两件事:
- 用
set(nums)去重,再转成新的列表对象; - 把函数内部的
nums变量重新指向这个新创建的列表。
这时候,外部的nums还是指向原来的旧列表,函数内部的局部变量只是换了个指向的对象,旧列表本身没被修改,所以打印出来还是原来的内容。
第二种情况:原列表被修改
再看这段代码:
def test(nums): nums.append(7) nums = [1,2,3,4,1,2,3,4] test(nums) print(nums) # 输出 [1,2,3,4,1,2,3,4,7]
这里的nums.append(7)是调用了列表对象的append方法,直接修改了nums指向的那个原列表对象的内容。因为函数内部的nums和外部的nums指向同一个可变的列表对象,对这个对象的修改会直接反映到外部,所以打印时能看到新增的元素。
打个比方:把列表比作房子,变量nums是开门的钥匙。第一种情况是你拿钥匙配了一把新钥匙,开了另一栋新房子,原来的房子没任何变化;第二种情况是你用钥匙打开原来的房子,往里面放了个新东西,房子本身被改动了。
内容的提问来源于stack exchange,提问作者tyrismarkease
相关产品推荐
相关产品推荐

