Python基础知识(六)—关于列表深拷贝和浅拷贝及内存图

# list01 是变量,存储列表对象的地址.
#列表引用
list01 = ["张无忌","赵敏","周芷若"]
# list02 得到的是列表对象地址
list02 = list01 # 不拷贝,创建了一个变量绑定原对象
list01[0] = "老张"   # 修改的是列表list01第一个元素存储的对象地址
print(list02[0])# ?"老张"# 因为list02和list01绑定的是同一个对象地址,虽然改变了对象里面的元素,但是对象地址没变,因此list02也跟着修改了

list01 = ["张无忌","赵敏","周芷若"]
list02 = list01
list01 = "老张"  # 修改的是变量list01绑定的对象地址
print(list02[0])# ?"张无忌"# list01绑定的对象地址改变了。而list02依然绑定的是原对象地址

浅拷贝 shallow copy
      浅拷贝是指在复制过程中,只复制一层变量,不会复制深层变量绑定的对象的复制过程
list01 = ["张无忌","赵敏","周芷若"]
list02 = list01[:] (等同于list02=list01.copy())
# 通过切片复制新列表(拷贝了列表中的变量,新列表中变量依然绑定list01的对象地址,而不是绑定list01的原对象)
list01[0] = "老张" print(list02[0])# ?"张无忌"

list01 = ["张无忌",["赵敏","周芷若"]]
list02 = list01#  不拷贝,创建了一个变量绑定了原对象
# 修改列表第二个元素的第二个元素
list01[1][1] = "芷若"
print(list02[1][1])    #"芷若"#修改了原对象地址,所以list02改变了

list01 = ["张无忌",["赵敏","周芷若"]]
list02 = list01[:]
list02 = list01.copy() # 浅拷贝
list01[1][1] = "芷若"
print(list02[1][1])    # 芷若

import copy

list01 = ["张无忌",["赵敏","周芷若"]]
list02 =copy.deepcopy(list01)  # 深拷贝(重新创建了一个对象和对象地址,绑定了新的对象和对象地址,因此原对象和对象地址的改变与新的无关)
list01[1][1] = "芷若"
print(list02[1][1]) # 周芷若

posted @ 2019-05-08 23:56  maplethefox  阅读(1080)  评论(0编辑  收藏  举报