上集:一家人
# 一家人的全部家当:
family = [0, 1, 2, 3, 4, 5]
# 这些家当是兄弟一的,也是兄弟二的:
brother1 = brother2 = family
取list变量整体进行赋值。如下图所示,左侧的三个list变量,指向的是同一块内存区域(幸福的一家)。
# 兄弟一小富了,兄弟二也跟着小富,全家都小富(按索引修改):
brother1[0] = 8
# 兄弟一大发了,兄弟二也跟着大发,全家都大发(按切片修改):
brother1[1:3] = [88, 888]
幸福的一家人,有福同享,共同富裕。兄弟一的,是兄弟二的,也是全家的。
print('大家始终是幸福一家:', family, brother1, brother2)
大家始终是幸福一家: [8, 88, 888, 3, 4, 5] [8, 88, 888, 3, 4, 5] [8, 88, 888, 3, 4, 5]
下集:分家后
# 一家人原始的家当:
family = [0, 1, 2, 3, 4, 5]
# 分家啦,各分得相应家当:
brother1 = family[0:3]
brother2 = family[3:]
原有的家当被一分为二,兄弟一是兄弟一的,兄弟二是兄弟二的,各自是各自的。
# 兄弟一又小富了(按索引修改):
brother1[0] = 8
# 兄弟一又大发了(按切片修改):
brother1[1:3] = [88, 888]
这一次,跟兄弟二没关系,跟原来的家庭更没关系。family列表就像一张发黄的老照片,挂在那里,仅仅标示着曾经的过往…
总结:
- 取list列表变量整体,赋值给另外的变量,则大家指向的是同一块list内存区域,一改同时改;
- 取list按索引或者分片得到的结果赋值给另外的变量,则触发“分家”,会在内存中开辟新的空间;
- 对list变量的局部修改,只要是直接修改(不经过上述另外变量周转),无论是按索引修改,还是按切片修改,修改的都是该list指向的内存空间。