Python中的赋值及深浅拷贝
赋值
示例
# 赋值
a = ['aa', 'bb', 14, 12]
b = a
print('a:{}\nb:{}'.format(a, b))
print('a的内存地址:{}\nb的内存地址:{}'.format(id(a), id(b))) # a,b内存地址相同,指向内存中同一个区域。
a[0] = 1
print("执行了‘a[0] = 1’后".center(50, '*'))
print('a:{}\nb:{}'.format(a, b)) # a的值发生改变,b的值也随之发生改变
print('a的内存地址:{}\nb的内存地址:{}'.format(id(a), id(b))) # a,b内存地址相同,指向内存中同一个区域。
b[1] = 2
print("执行了‘b[1] = 2’后".center(50, '*'))
print('a:{}\nb:{}'.format(a, b)) # b的值发生改变,a的值也随之发生改变
print('a的内存地址:{}\nb的内存地址:{}'.format(id(a), id(b))) # a,b内存地址相同,指向内存中同一个区域。
打印
a:['aa', 'bb', 14, 12]
b:['aa', 'bb', 14, 12]
a的内存地址:140362409249160
b的内存地址:140362409249160
******************执行了‘a[0] = 1’后******************
a:[1, 'bb', 14, 12]
b:[1, 'bb', 14, 12]
a的内存地址:140362409249160
b的内存地址:140362409249160
******************执行了‘b[1] = 2’后******************
a:[1, 2, 14, 12]
b:[1, 2, 14, 12]
a的内存地址:140362409249160
b的内存地址:140362409249160
浅拷贝
示例
# 浅拷贝
a = ['aa', [1, 2, 3], 'bb', 14, 12]
b = a.copy() # 浅拷贝
print('a:{}\nb:{}'.format(a, b))
print('a的内存地址:{}\nb的内存地址:{}'.format(id(a), id(b))) # a,b内存地址不同
b[0] = 'cc'
print("执行了b[0] = 'cc'后".center(50, '*'))
print('a:{}\nb:{}'.format(a, b)) # 只改变(b[0] = 'cc')最外层列表时,b[0] = 'cc',a[1][0] = 1,a[0]的值无变化
print('a的内存地址:{}\nb的内存地址:{}'.format(id(a), id(b))) # a,b内存地址不同
b[1][0] = 10
print("执行了‘a[1][0] = 10’后".center(50, '*'))
print('a:{}\nb:{}'.format(a, b)) # 改变(b[1][0] = 10)第二层列表中的值时,b[1][0] = 10,a[1][0] = 10
print('a的内存地址:{}\nb的内存地址:{}'.format(id(a), id(b))) # a,b内存地址不同
打印
a:['aa', [1, 2, 3], 'bb', 14, 12]
b:['aa', [1, 2, 3], 'bb', 14, 12]
a的内存地址:139809337808456
b的内存地址:139809337809160
*****************执行了b[0] = 'cc'后******************
a:['aa', [1, 2, 3], 'bb', 14, 12]
b:['cc', [1, 2, 3], 'bb', 14, 12]
a的内存地址:139809337808456
b的内存地址:139809337809160
****************执行了‘a[1][0] = 10’后****************
a:['aa', [10, 2, 3], 'bb', 14, 12]
b:['cc', [10, 2, 3], 'bb', 14, 12]
a的内存地址:139809337808456
b的内存地址:139809337809160
深拷贝
示例
# 深拷贝
import copy
a = ['aa', [1, 2, 3], 'bb', 14, 12]
b = copy.deepcopy(a) # 深拷贝
print('a:{}\nb:{}'.format(a, b))
print('a的内存地址:{}\nb的内存地址:{}'.format(id(a), id(b))) # a,b内存地址不同
b[0] = 'cc'
print("执行了b[0] = 'cc'后".center(50, '*'))
print('a:{}\nb:{}'.format(a, b)) # 改变(b[0] = 'cc')最外层列表时,b[0] = 'cc',a[0] = 'aa',a[0]值无变化
print('a的内存地址:{}\nb的内存地址:{}'.format(id(a), id(b))) # a,b内存地址不同
b[1][0] = 10
print("执行了‘a[1][0] = 10’后".center(50, '*'))
print('a:{}\nb:{}'.format(a, b)) # 改变(b[1][0] = 10)第二层列表中的值时,b[1][0] = 10,a[1][0] = 1,a[1][0]无变化
print('a的内存地址:{}\nb的内存地址:{}'.format(id(a), id(b))) # a,b内存地址不同
打印
a:['aa', [1, 2, 3], 'bb', 14, 12]
b:['aa', [1, 2, 3], 'bb', 14, 12]
a的内存地址:139961185536008
b的内存地址:139961185537288
*****************执行了b[0] = 'cc'后******************
a:['aa', [1, 2, 3], 'bb', 14, 12]
b:['cc', [1, 2, 3], 'bb', 14, 12]
a的内存地址:139961185536008
b的内存地址:139961185537288
****************执行了‘a[1][0] = 10’后****************
a:['aa', [1, 2, 3], 'bb', 14, 12]
b:['cc', [10, 2, 3], 'bb', 14, 12]
a的内存地址:139961185536008
b的内存地址:139961185537288
三层列表演示
示例
# 三层列表示例
import copy
a = ['aa', [['哈哈哈', '呵呵呵'], 1, 2, 3], 'bb', 14, 12]
c = a.copy() # 浅拷贝
b = copy.deepcopy(a) # 深拷贝
print('a:{}\nb:{}\nc:{}'.format(a, b, c))
print('a的内存地址:{}\nb的内存地址:{}\nc的内存地址:{}'.format(id(a), id(b), id(c))) # a,b,c内存地址不同
a[1][0][1] = '啦啦啦'
print("执行了a[1][0][1]='啦啦啦'后".center(50, '*'))
print('a:{}\nb:{}\nc:{}'.format(a, b, c)) # c浅拷贝的值随着a的改变而发生变化,b深拷贝的值无变化.
print('a的内存地址:{}\nb的内存地址:{}\nc的内存地址:{}'.format(id(a), id(b), id(c))) # a,b,c内存地址不同
打印
a:['aa', [['哈哈哈', '呵呵呵'], 1, 2, 3], 'bb', 14, 12]
b:['aa', [['哈哈哈', '呵呵呵'], 1, 2, 3], 'bb', 14, 12]
c:['aa', [['哈哈哈', '呵呵呵'], 1, 2, 3], 'bb', 14, 12]
a的内存地址:140291239103560
b的内存地址:140291239103432
c的内存地址:140291239103496
***************执行了a[1][0][1]='啦啦啦'后***************
a:['aa', [['哈哈哈', '啦啦啦'], 1, 2, 3], 'bb', 14, 12]
b:['aa', [['哈哈哈', '呵呵呵'], 1, 2, 3], 'bb', 14, 12]
c:['aa', [['哈哈哈', '啦啦啦'], 1, 2, 3], 'bb', 14, 12]
a的内存地址:140291239103560
b的内存地址:140291239103432
c的内存地址:140291239103496