You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 10:21:16