Python列表切片调用方法与重新赋值的差异及原理疑问
为什么列表切片
a[:]调用方法不修改原列表,但切片赋值会? 先看你运行的代码及结果:
测试代码:
a = list('zyx') a[:].pop() print(a) a = list('zyx') a[:].append('o') print(a) a = list('zyx') a[:].clear() print(a) a = list('zyx') a[:] = [] print(a)
运行结果:
['z', 'y', 'x'] ['z', 'y', 'x'] ['z', 'y', 'x'] []
核心区别:a[:]的两种用法本质完全不同
a[:].方法():操作的是原列表的浅拷贝
当你写a[:]时,Python会生成原列表的一个浅拷贝——这是一个全新的列表对象,和原列表a指向内存中不同的位置。
比如a[:].pop(),实际是先创建a的拷贝,然后对这个拷贝执行pop(),修改的只是这个临时拷贝,原列表a从头到尾都没被改动过。执行完后这个临时拷贝会被Python自动回收,所以打印a还是原来的内容。a[:] = []:切片赋值,直接原地修改原列表
切片赋值是Python的特殊语法,它的作用是直接修改原列表的内容:a[:]在这里代表原列表的整个元素范围,赋值操作会把原列表中这个范围内的元素全部替换成右边的可迭代对象(这里是空列表[])。
这个过程中,原列表的对象本身没有变(可以用id(a)验证,赋值前后id一致),只是它内部的元素被清空了,所以最终打印a得到空列表。
验证示例
可以通过打印对象ID直观看到区别:
a = list('zyx') print(id(a)) # 输出原列表的内存地址 print(id(a[:])) # 输出切片拷贝的地址,和原列表不同 a[:] = [] print(id(a)) # 赋值后地址仍和最初的原列表一致,说明是同一个对象
内容的提问来源于stack exchange,提问作者push.up.hoyv
相关产品推荐
相关产品推荐

