Python中对列表执行clear操作为何会清空所有指向该列表的变量?
两种执行结果差异的核心原因
- 你有C开发背景,可以先建立这个核心认知:Python中的变量名本质都是指向内存对象的引用,和C中声明后就对应固定内存地址的变量容器完全不同。Python中所有的
=赋值操作,本质都是修改变量的指向,而非拷贝对象内容。
第一种场景:执行a = [8]时的执行逻辑
逐行拆解执行过程:
- 执行
a = [1,2,3,4]:在堆内存中创建一个值为[1,2,3,4]的列表对象,将变量a的指向修改为该对象的内存地址 - 执行
b = a:将变量b的指向也设置为上述列表对象的内存地址,此时a和b指向同一个内存对象 - 执行
a = [8]:新创建一个值为[8]的列表对象,将a的指向修改为这个新对象的地址,该操作完全不会修改原本的[1,2,3,4]对象,也不会更改b的指向,b仍然指向最初的列表对象 - 因此
print(b)输出结果为[1,2,3,4]
第二种场景:执行a.clear()时的执行逻辑
逐行拆解执行过程:
- 前两步执行逻辑和第一种场景完全一致:
a和b共同指向内存中同一个[1,2,3,4]列表对象 - 执行
a.clear():这是调用当前a指向的列表对象的内置方法,直接修改该对象本身的内容,清空列表内的所有元素,该操作既不会改变a的指向,也不会改变b的指向,二者仍然指向同一个列表对象 - 因此访问该对象时拿到的就是清空后的内容,
print(b)输出结果为[]
补充说明
如果需要实现类似C++的值拷贝效果,让两个变量指向独立的列表对象,可以使用b = a.copy()或者b = a[:]语法完成列表浅拷贝,后续修改a就不会影响b的内容。
内容的提问来源于stack exchange,提问作者darren zou
相关产品推荐
相关产品推荐

