实际使用中,可能需要的是将里面的内容给复制出来到一个新的地址空间,这里可以使用python的copy模块,copy模块分为两种拷贝,一种是浅拷贝,一种是深拷贝。假设处理一个list对象,浅拷贝调用函数copy.copy(),产生了一块新的内存来存放list中的每个元素引用,也就是说每个元素的跟原来list中元素地址是一样的。所以从下面例子中可看出当原list中要是包含list对象,分别在a和b对list元素做操作时,两边都受到了影响。此外,通过b=list(a)来对变量b赋值时,也跟浅拷贝的效果一样。
a = [1, 1000, [‘a’, ‘b’]]
b = copy.copy(a)
b
[1, 1000, [‘a’, ‘b’]]hex(id(a))
‘0x7fe7e02e1368’hex(id(b))
‘0x7fe7e02e1518’hex(id(a[2]))
‘0x7fe7e02caea8’hex(id(b[2]))
‘0x7fe7e02caea8’a[2].append(‘a+’)
a
[1, 1000, [‘a’, ‘b’, ‘a+’]]b
[1, 1000, [‘a’, ‘b’, ‘a+’]]b[2].append(‘b+’)
a
[1, 1000, [‘a’, ‘b’, ‘a+’, ‘b+’]]b
[1, 1000, [‘a’, ‘b’, ‘a+’, ‘b+’]]a[0] = 2
a
[2, 1000, [‘a’, ‘b’, ‘a+’, ‘b+’]]b
[1, 1000, [‘a’, ‘b’, ‘a+’, ‘b+’]]
而深拷贝则调用copy.deepcopy(),它将原list中每个元素都复制了值到新的内存中去了,因此跟原来的元素地址不相同,那么再对a和b的元素做操作,就是互相不影响了。
a = [1, 1000, [‘a’, ‘b’]]
b = copy.deepcopy(a)
hex(id(a))
‘0x7fe7e02cae18’hex(id(b))
‘0x7fe7e02e1368’hex(id(a[2]))
‘0x7fe7e02e14d0’hex(id(b[2]))
‘0x7fe7e02e1320’a[2].append(‘a+’)
a
[1, 1000, [‘a’, ‘b’, ‘a+’]]b
[1, 1000, [‘a’, ‘b’]]b[2].append(‘b+’)
a
[1, 1000, [‘a’, ‘b’, ‘a+’]]b
[1, 1000, [‘a’, ‘b’, ‘b+’]]
当把一个变量传入一个函数时,它对应的对象引用个数增加2