浅拷贝和深拷贝和赋值(copy)

赋值

  • Python中的赋值语句不会复制对象,只是建立一个引用关联,原数据变,赋值后的数据也会变。
  • 小整数对象池:Python把**[-5, 256]**之间的数字提前建立好,不会被垃圾回收。这范围中的数值相等,则地址也会相等,因为都是同一个对象。例如:
var1 = -5
print(id(-5))
print(id(var1)) # 指向地址一样


var2 = -6
print(id(-6))
print(id(var2)) # 指向地址不一样

is和==的区别

  • is用来判断两个变量引用对象是否相同(地址是否相同);
  • ==用来判断两个变量的值是否相同。
  • is的判断条件更加苛刻

浅拷贝 copy

  • 如果浅拷贝的对象是不可变的数据类型(符合数据类型只要最外侧的类型是不可变),那么浅拷贝语句与赋值语句效果一样。
  • 如果浅拷贝对象是可变数据类型(符合类型只要最外侧的类型可变即可),那么浅拷贝会把该对象复制一份,但是该对象中的其他所有元素(包括符合类型数据中的元素),仍然为引用关系。
  • list.copy(), dict.copy(), set.copy()和切片是属于浅层copy。

深拷贝 deepcopy

  • 如果深拷贝对象是不可变数据类型(复合数据类型还需确保其中的所有元素不可变),那么深拷贝语句和赋值语句等效。
  • 如果深拷贝对象是可变数据类型或者其中的赋值类型数据中有可变的元素,那么深拷贝会把该对象复制一份。
  • 对于其中的原始分别递归的去适用前两点规划
import copy
tup1 = (911, "abc", [])  # 元组不可变类型,但是包含可变类型:列表
tup2 = copy.deepcopy(tup1)
print(tup1)
print(tup2)  # 内容一样

print(id(tup1))
print(id(tup2)) #引用不同地址,不一样 

print(id(tup1[0]))
print(id(tup2[0])) # 引用相同地址,一样(因为这是整型,是不可变类型,没有风险,因此deepcopy不复制)

print(id(tup1[1]))
print(id(tup2[1])) # 引用相同地址,一样(因为这是字符串,是不可变类型,没有风险,因此deepcopy不复制)

print(id(tup1[2]))
print(id(tup2[2]))# 引用相同地址,不一样(因为这是列表,是可变类型,有风险,因此deepcopy复制)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值