Python list索引与切片赋值的对象引用机制疑问
Python列表引用与切片运行逻辑说明
初始引用赋值的现象
最初的测试代码如下:
def func(first): third = first[0] first[0][0] = 5 print(third) first = [[3,4]] func(first)
- 最初预期输出:
[3,4] - 实际运行输出:
[5,4] - 逻辑说明:
third = first[0]属于引用赋值,没有复制列表对象本身,third和first[0]指向内存中同一个列表实例。修改这个实例内部的元素时,所有指向该实例的变量读取到的内容都会同步更新。
切片赋值的运行差异
针对切片引用的疑问,对应测试代码如下:
def func(first): third = first[0][0:2] first[0][0] = 5 print(third) first = [[3,4]] func(first)
核心结论
对列表执行切片操作会创建一个全新的列表对象,由赋值的变量独立引用。
- 上述代码中,
first[0][0:2]会生成一个新列表,存储原嵌套列表指定区间元素的副本,third指向这个独立的新列表。 - 后续执行
first[0][0] = 5修改的是原嵌套列表的元素,和切片生成的新列表没有绑定关系,因此这段代码的输出为[3,4]。
补充说明:列表切片属于浅拷贝,如果切片范围内的元素本身是可变对象(比如嵌套列表),新列表中存储的仍然是这些可变对象的引用,修改内层可变对象时两边仍会同步变化。但本案例中切片范围内的元素是整数这类不可变类型,因此不会出现联动修改的情况。
内容的提问来源于stack exchange,提问作者Tan Yong Boon
相关产品推荐
相关产品推荐

