6、python-详解赋值、浅拷贝、深拷贝

前提条件

内存地址一样的对象,改变一个,其他对象也会跟着改变

一.直接赋值

1.对不可变的数据类型直接赋值

a = '123'
a1 = a
print("a=>", a, id(a))
print("a1=>", a1, id(a1))
a = 1234
print("a=>", a, id(a))
print("a1=>", a1, id(a1))

# a=> 123 2079851612464
# a1=> 123 2079851612464
# a=> 1234 2079851698160
# a1=> 123 2079851612464

2.对可变的数据类型直接赋值

a = [1, 2, 3]
b = {"1": 1, "2": 2, "3": ['a', 'b', 'c']}
a1 = a
b1 = b
print("a=>", a, id(a))
print("a1=>", a1, id(a1))
print("b=>", b, id(b))
print("b['3']=>", b['3'], id(b['3']))
print("b['1']=>", b['1'], id(b['1']))
print("b1=>", b1, id(b1))
print('==============================================================')
a.append(4)
b['4'] = 4
b['3'].append('0')
print("a=>", a, id(a))
print("a1=>", a1, id(a1))
print("b=>", b, id(b))
print("b['3']=>", b['3'], id(b['3']))
print("b['1']=>", b['1'], id(b['1']))
print("b1=>", b1, id(b1))

# a=> [1, 2, 3] 2005102744128
# a1=> [1, 2, 3] 2005102744128
# b=> {'1': 1, '2': 2, '3': ['a', 'b', 'c']} 2005101204288
# b['3']=> ['a', 'b', 'c'] 2005102743104
# b['1']=> 1 140708344239888
# b1=> {'1': 1, '2': 2, '3': ['a', 'b', 'c']} 2005101204288
# ==============================================================
# a=> [1, 2, 3, 4] 2005102744128
# a1=> [1, 2, 3, 4] 2005102744128
# b=> {'1': 1, '2': 2, '3': ['a', 'b', 'c', '0'], '4': 4} 2005101204288
# b['3']=> ['a', 'b', 'c', '0'] 2005102743104
# b['1']=> 1 140708344239888
# b1=> {'1': 1, '2': 2, '3': ['a', 'b', 'c', '0'], '4': 4} 2005101204288

结论:直接赋值,无论是可变对象还是不可变对象都不会开辟新的内存空间

二.浅拷贝

1.对不可变的数据类型直接赋值

import copy

a = '123'
a1 = copy.copy(a)
print("a=>", a, id(a))
print("a1=>", a1, id(a1))
a = 1234
print("a=>", a, id(a))
print("a1=>", a1, id(a1))

# a=> 123 2068640106992
# a1=> 123 2068640106992
# a=> 1234 2068640192496
# a1=> 123 2068640106992

2.对可变的数据类型直接赋值

import copy

a = [1, 2, 3]
b = {"1": 1, "2": 2, "3": ['a', 'b', 'c']}
a1 = copy.copy(a)
b1 = copy.copy(b)
print("a=>", a, id(a))
print("a1=>", a1, id(a1))
print("b=>", b, id(b))
print("b['3']=>", b['3'], id(b['3']))
print("b['1']=>", b['1'], id(b['1']))
print("b1=>", b1, id(b1))
print('==============================================================')
a.append(4)
b['4'] = 4
b['3'].append('0')
b['1'] = 111
print("a=>", a, id(a))
print("a1=>", a1, id(a1))
print("b=>", b, id(b))
print("b['3']=>", b['3'], id(b['3']))
print("b['1']=>", b['1'], id(b['1']))
print("b1=>", b1, id(b1))

# a=> [1, 2, 3] 1962622177088
# a1=> [1, 2, 3] 1962622180544
# b=> {'1': 1, '2': 2, '3': ['a', 'b', 'c']} 1962620638016
# b['3']=> ['a', 'b', 'c'] 1962622004416
# b['1']=> 1 140708344239888
# b1=> {'1': 1, '2': 2, '3': ['a', 'b', 'c']} 196262063808
# ==============================================================
# a=> [1, 2, 3, 4] 1962622177088
# a1=> [1, 2, 3] 1962622180544
# b=> {'1': 111, '2': 2, '3': ['a', 'b', 'c', '0'], '4': 4} 1962620638016
# b['3']=> ['a', 'b', 'c', '0'] 1962622004416
# b['1']=> 111 140708344243408
# b1=> {'1': 1, '2': 2, '3': ['a', 'b', 'c', '0']} 196262063808

1.浅拷贝对不可变的数据类型(无论是内外层),不会开辟新的内存空间

2.浅拷贝对可变的数据类型外层会开辟新的内存空间,当被拷贝对象的外层数据改变时,不会影响拷贝的对象

3.浅拷贝对可变的数据类型内层会开辟新的内存空间,当被拷贝对象的内层可变的数据类型改变时,其拷贝对象的内层可变的数据类型也会随之改变

三.深拷贝

1.对不可变的数据类型直接赋值

import copy

a = '123'
a1 = copy.deepcopy(a)
print("a=>", a, id(a))
print("a1=>", a1, id(a1))
a = 1234
print("a=>", a, id(a))
print("a1=>", a1, id(a1))

# a=> 123 1280857016816
# a1=> 123 1280857016816
# a=> 1234 1280857102320
# a1=> 123 1280857016816

2.对可变的数据类型直接赋值

import copy

a = [1, 2, 3]
b = {"1": 1, "2": 2, "3": ['a', 'b', 'c']}
a1 = copy.deepcopy(a)
b1 = copy.deepcopy(b)
print("a=>", a, id(a))
print("a1=>", a1, id(a1))
print("b=>", b, id(b))
print("b['3']=>", b['3'], id(b['3']))
print("b['1']=>", b['1'], id(b['1']))
print("b1=>", b1, id(b1))
print('==============================================================')
a.append(4)
b['4'] = 4
b['3'].append('0')
b['1'] = 111
print("a=>", a, id(a))
print("a1=>", a1, id(a1))
print("b=>", b, id(b))
print("b['3']=>", b['3'], id(b['3']))
print("b['1']=>", b['1'], id(b['1']))
print("b1=>", b1, id(b1))

# a=> [1, 2, 3] 1323689037440
# a1=> [1, 2, 3] 1323689040960
# b=> {'1': 1, '2': 2, '3': ['a', 'b', 'c']} 1323683304256
# b['3']=> ['a', 'b', 'c'] 1323688864896
# b['1']=> 1 140708344239888
# b1=> {'1': 1, '2': 2, '3': ['a', 'b', 'c']} 1323687938048
# ==============================================================
# a=> [1, 2, 3, 4] 1323689037440
# a1=> [1, 2, 3] 1323689040960
# b=> {'1': 111, '2': 2, '3': ['a', 'b', 'c', '0'], '4': 4} 1323683304256
# b['3']=> ['a', 'b', 'c', '0'] 1323688864896
# b['1']=> 111 140708344243408
# b1=> {'1': 1, '2': 2, '3': ['a', 'b', 'c']} 1323687938048

深拷贝对不可变的数据类型(无论是内外层)和可变的数据类型,都会开辟新的内存空间

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

御剑天涯

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值