Python中赋值引用机制的疑问及独立拷贝实现咨询
Python中赋值引用机制的疑问及独立拷贝实现咨询
嗨,这个现象其实不是Python的bug,而是它处理可变对象时的正常特性,咱们一步步拆解清楚:
首先来看你写的这段代码:
a = [0,0] b = a a[0] = 1 print(b)
运行后确实会输出[1,0],核心原因在于:Python里的列表属于可变对象,当你执行b = a的时候,并不是把a里的内容完整复制一份给b,而是让变量b和a指向了同一个内存地址里的列表对象。就好比两个人共用同一个笔记本,你在本子上改了内容,另一个人翻开看到的自然也是修改后的版本。
你之前用类似代码没遇到问题,大概率是当时操作的是不可变对象(比如整数、字符串、元组),这类对象的“修改”其实会创建一个全新的对象,不会影响原来的引用。比如你写x = 5; y = x; x = 10,这时候y还是5,因为x被重新赋值成了新的整数对象,和y指向的不是同一个了;但列表这种可变对象的元素修改是直接在原对象上操作的,所以会同步反映到所有指向它的变量上。
那要实现你想要的效果——让b保持最初的[0,0],也就是创建一个独立的列表拷贝,有几种常用方法:
- 用切片语法:
b = a[:],切片会返回一个包含原列表所有元素的新列表 - 用list()构造函数:
b = list(a),通过构造新列表来复制原列表内容 - 用copy模块的浅拷贝方法:先导入copy模块,然后
b = copy.copy(a)(如果你的列表里只有简单的不可变元素,浅拷贝就足够了) - 列表推导式:
b = [item for item in a],遍历原列表元素生成新列表
比如修改你的代码成这样,b就会保持[0,0]了:
a = [0,0] b = a[:] # 用切片创建独立拷贝 a[0] = 1 print(b) # 输出 [0,0]
备注:内容来源于stack exchange,提问作者Allen Lan
相关产品推荐
相关产品推荐

