2020-08-03:内存对象与拷贝函数

内存对象

 内存对象包括id、类型(type)和值(value)。

例1

a = [1,2,3]
b = [1,2,3]
print(id(a))
print(id(b))
print(a == b)

输出:
在这里插入图片描述

  1. id(a)与id(b)不同,因为a、b虽然内容一模一样,但内存地址不同。
  2. print(a == b)输出为True,说明关系表达式比较的是a、b的值,与内存地址无关。

例2

a = 4
b = a
print(id(a))
print(id(b))

输出:
例2输出
可见将一个变量赋值给另一个变量能使得两个变量具有相同的内存地址。这是因为赋值语句的本质是直接使被赋值对象指向赋值对象的内存地址。

例3

a = [1,2,3]
b = [1,2,3,a]
import copy
c = copy.deepcopy(b)  #深拷贝
d = copy.copy(b)

list_list = [b,c,d]
list_name = ['b','c','d']

print('id(a):'+str(id(a)))
for i in range(len(list_list)):
    print('id('+list_list[i]+'):'+str(id(list_list[i])))
    print('id('+list_list[i]+'[3]):'+str(id(list_list[i][3])))

输出:
例3输出

  1. id(a) == id(b[3]),但id(b)与id©、id(d)均不相等,说明copy()与deepcopy()能够改变内存地址,而例2的赋值语句不可以。这是因为copy()与deepcopy()重新生成了对象,而例2的赋值语句没有生成新对象。

  2. id(a) == id(b[3]) == id(d[3]) != id(c[3]),可见copy()与deepcopy()的不同之处,copy(b)仅仅进行拷贝b本身,因此id(b[3]) == id(d[3])。而deepcopy()对b[3]这个列表也同样进行了拷贝操作。

例3-1
import copy
a = [1,[2,[3]]]
b = copy.deepcopy(a)
c = copy.deepcopy(a)
print('id(a):'+str(id(a)))
print('id(b):'+str(id(b)))
print('id(c):'+str(id(c)))
print('id(b[0]):'+str(id(b[0])))
print('id(c[0]):'+str(id(c[0])))
print('id(b[1]):'+str(id(b[1])))
print('id(c[1]):'+str(id(c[1])))
#print('id(b[1][0]):'+str(id(b[1][0)))
print('id(c[1][0]):'+str(id(c[1][0])))

输出:
例3-1输出

  1. id(b[0]) == id(c[0])
  2. 值得注意的是,运行注释行会报错。这进一步说明了,copy(a)函数仅拷贝a和a的元素本身,并不拷贝a[1]列表中的元素,以至于b[1][0]这个元素不存在。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值