python中的深浅拷贝与赋值。

赋值:

赋值就是一个变量引用一个变量的值。这两个变量共用一个内存地址。									
当使用可变数据结构时(如 list, dict, set),其中一个变量的值改变,会使另一个变量的值也发生改变,但内存地址不改变。
a = [1, 2, 3]
b = a
b[1] = 4
print(id(a), a, id(b), b)    #1992269718152 [1, 4, 3] 1992269718152 [1, 4, 3]
# a, b两个变量共用一块内存地址,当其中一个变量的值改变时,会使内存地址中存储的值发生改变,所以两个变量的值都会发生改变,内存地址不发生变化。
a = {1: 2, 2: 3}
b = a
b[1] = 5
print(id(a), a, id(b), b)    # 2878324414216 {1: 5, 2: 3} 2878324414216 {1: 5, 2: 3}
在变量使用不可变数据时(如str, int,bool,元组),当你改变变量的值时,内存会重新开辟一块内存存储改变的值,所以变两个量不会一起改变,但是值发生变化的变量,内存会发生变化。
当值不发生改变时, 两个变量的内存地址是一样的。
a = 1
b = a
a = 4
print(id(a), a, id(b), b)    # 140728118239984 4 140728118239888 1

a = 'abc'
b = a
a = 'b'
print(id(a), a, id(b), b)    # 1217126454304 b 1217126541384 abc

a = (1, 2, 3)
b = a
a = (4, 5, 6)
print(id(a), a, id(b), b)    # 2786397815864 (4, 5, 6) 2786397816872 (1, 2, 3)

拷贝

当使用的是不可变数据,变量的值没有被改变时,两个变量的内存地址是相同的。
import copy

a = 1
b = copy.copy(a)
print(id(a), a, id(b), b)    # 140728118239888 1 140728118239888 1
当使用的是可变数据时,b变量会将a变量的值拷贝一份,同时开辟一块新的内存地址存储所拷贝的值。
import copy

a = [1, 2, 3]
b = copy.copy(a)
print(id(a), a, id(b), b)    # 2332683297416 [1, 2, 3] 2332683297480 [1, 2, 3]
如果改变列表a中元素的值,会发现b变量并不会随着a变量元素的改变而改变。
import copy
a = [1, 2, 3]
b = copy.copy(a)
a[0] = 2
print(id(a), a, id(b), b)    # 2843040768648 [2, 2, 3] 2843040768712 [1, 2, 3]

浅拷贝:

浅拷贝,顾名思义,浅浅的拷贝。在面对可变数据类型时,浅拷贝只拷贝第一层的数据。

如果在a列表中在嵌套一个列表,会发现两个嵌套列表的内存地址是相同的。
同时改变a嵌套列表中元素的值时,b列表中嵌套列表的值也会发生改变。
这是因为浅拷贝只能拷贝可变数据的第一层,第二层是不会拷贝的。
import copy
a = [1, [2, 3], 3]
b = copy.copy(a)
a[0] = 2
a[1][0] = 1
print(id(a), a, id(b), b)    # 2583273104072 [2, [1, 3], 3] 2581515309384 [1, [1, 3], 3]
print(id(a[1]), a[1], id(b[1]), b[1])    # 2295949451912 [1, 3] 2295949451912 [1, 3]

深拷贝:

深拷贝会拷贝所有的可变数据。不论是第一层还是第二层,都会进行拷贝。
在a列表中嵌套列表,改变a嵌套列表元素的值时,b列表的嵌套列表元素并不会发生改变。
a,b列表的嵌套列表的内存地址也不相同。	
a = [1, [2, 3], 3]
b = copy.deepcopy(a)
a[0] = 2
a[1][0] = 1
print(id(a), a, id(b), b)    # 2772121445064 [2, [1, 3], 3] 2770363519368 [1, [2, 3], 3]
print(id(a[1]), a[1], id(b[1]), b[1])    # 2772121445000 [1, 3] 2772122726664 [2, 3]

以上就是我对变量赋值和深浅拷贝的理解。如果有错误,欢迎指出。
希望大家一起学习,共同进步。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值