Python中的赋值和深浅拷贝

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