Python中赋值与对象拷贝:两类示例行为差异的原因问询
为什么两个列表赋值示例的结果不一样?
嘿,这个问题戳中了Python里列表引用与重新赋值的关键区别,我给你一步步拆解清楚:
第一个示例:原地修改同一个列表对象
先看你的代码:
def bubbleSort(alist): for passnum in range(len(alist)-1,0,-1): for i in range(passnum): if alist[i]>alist[i+1]: temp = alist[i] alist[i] = alist[i+1] alist[i+1] = temp return alist a=[3,2,1] b=a a=bubbleSort(a) print(a) print(b)
输出:
[1, 2, 3]
[1, 2, 3]
这里的核心逻辑是:
b=a执行后,a和b指向同一个列表对象——你可以把它理解成给同一个“盒子”贴了两个标签,a和b都是这个盒子的名字。bubbleSort(a)函数里的操作是原地修改这个列表:它只是交换列表内部元素的位置,没有创建新的列表,最后return的alist还是原来的那个盒子。- 所以
a=bubbleSort(a)其实还是让a指向原来的盒子(只是盒子里的元素顺序变了),b作为同一个盒子的另一个标签,自然也能看到变化后的内容。
第二个示例:给变量重新赋值新列表
再看第二个代码:
a=[3,2,1] b=a a=[1,2,3] print(a) print(b)
输出:
[1, 2, 3]
[3, 2, 1]
这里的关键差异在于:
- 一开始
b=a同样是让a和b指向同一个列表盒子。 - 但之后的
a=[1,2,3]是给a重新赋值了一个全新的列表对象——相当于把a标签从原来的盒子撕下来,贴到了一个装着[1,2,3]的新盒子上。 - 而b标签还牢牢贴在原来的[3,2,1]盒子上,所以打印b时,显示的还是原来盒子里的内容。
简单总结:
- 如果是修改列表内部元素(比如排序、
append、pop),所有指向这个列表的变量都会同步看到变化; - 如果是给变量重新赋值新列表,只有被赋值的变量指向新对象,其他变量还是绑定原来的列表。
内容的提问来源于stack exchange,提问作者Sahar
相关产品推荐
相关产品推荐

