关于Python列表切片复制与直接赋值的行为差异技术问询
搞懂Python列表赋值的区别:为什么
b=a[:]和b=a的结果天差地别? 嘿,这个问题刚好踩中了Python里变量引用和列表副本的核心逻辑,我给你一步步拆解清楚~
先搞懂两个赋值语句的本质
1. b = a[:]:创建独立的列表副本
当你用a[:]的时候,Python会创建一个全新的列表对象,把原列表a里的所有元素都复制到这个新对象里,然后让变量b指向这个新对象。简单说:
a和b现在是内存里两个完全分开的列表,各自有自己的存储空间- 不管你之后怎么修改
a的内容,b都不会受到影响,因为它俩根本不是同一个东西
2. b = a:共享同一个列表对象
这个赋值就简单了——它没有复制任何元素,只是让变量b和a指向同一个列表对象。相当于给同一个列表起了两个名字,就像你叫“张三”,朋友也叫你“小张”,喊哪个名字都是在说你。所以:
- 不管用
a还是b去修改这个列表,另一个变量看到的都是修改后的结果,因为它们指向的是同一个东西
结合你的两个例子拆解
第一个例子:b是独立副本,不受a的修改影响
a = [1, 3, 5] # 创建列表对象X,a指向X b = a[:] # 创建新列表对象Y(复制X的元素),b指向Y a[:] = [x**2 for x in a] # 原地修改X,把X的元素换成[1,9,25] a[:] = [0] # 再原地修改X,把X变成[0] print(b) # b指向的是Y,Y里还是[1,3,5],所以输出[1,3,5]
这里的a[:] = ...是原地修改列表X,并没有让a指向新对象,所以b的指向完全不受影响。
第二个例子:b和a共享同一个列表,同步修改
a = [1, 3, 5] # 创建列表对象X,a指向X b = a # b也指向X,现在a和b是同一个列表的两个名字 a[:] = [x**2 for x in a] # 原地修改X,变成[1,9,25],b看到的也是这个结果 a[:] = [0] # 再原地修改X为[0],b自然也跟着变成[0] print(b) # 输出[0]
这里每次a[:] = ...都是在修改同一个列表X,而b和a指向的是同一个X,所以b的内容会同步变化。
额外补充:别混淆a[:] = ...和a = ...
如果把例子里的a[:] = [0]改成a = [0],结果又会不一样:
a = [0]是让a指向一个新的列表对象Z,而b还是指向原来的X- 这时候
print(b)就会是修改前的结果(比如第一个例子里还是[1,3,5],第二个例子里是[1,9,25]) - 核心区别是:
a[:] = ...是修改原列表,a = ...是让变量指向新列表
内容的提问来源于stack exchange,提问作者Vicrobot
相关产品推荐
相关产品推荐

