内存对象
内存对象包括id、类型(type)和值(value)。
例1
a = [1,2,3]
b = [1,2,3]
print(id(a))
print(id(b))
print(a == b)
输出:
- id(a)与id(b)不同,因为a、b虽然内容一模一样,但内存地址不同。
- print(a == b)输出为True,说明关系表达式比较的是a、b的值,与内存地址无关。
例2
a = 4
b = a
print(id(a))
print(id(b))
输出:
可见将一个变量赋值给另一个变量能使得两个变量具有相同的内存地址。这是因为赋值语句的本质是直接使被赋值对象指向赋值对象的内存地址。
例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])))
输出:
-
id(a) == id(b[3]),但id(b)与id©、id(d)均不相等,说明copy()与deepcopy()能够改变内存地址,而例2的赋值语句不可以。这是因为copy()与deepcopy()重新生成了对象,而例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])))
输出:
- id(b[0]) == id(c[0])
- 值得注意的是,运行注释行会报错。这进一步说明了,copy(a)函数仅拷贝a和a的元素本身,并不拷贝a[1]列表中的元素,以至于b[1][0]这个元素不存在。