导语:对于python,我们要明确python的变量是采用引用语义的方式对变量进行存储,即变量存储的是变量的值所在的内存地址,而不是这个值本身,所以我们可以简单的把‘=’理解为引用。因此,这种方式下变量的存储空间大小是一致的。
还有另外一种是值语义,会将变量的值直接保存在变量的存储区,比如C语言。相信大家一定记得考试的时候会被问int几个字节之类的问题,哈哈哈!
写这篇博客的原因是发现我用两个变量分别保存一个变量的前后状态,新变量是相同的,当时第一个反应就是这事地址引用了,所以开始查资料,最后写出这篇博客。其实,对于这种问题,还有一种方法是直接输出变量的地址,如下。
print(id(变量))
- 首先明确一下拷贝的含义:拷贝分为两种,一种是值拷贝,一种是地址拷贝。二者看起来都一样,但是区别在于值赋值本质上是生成了一个新的地址保存数据,所以修改被拷贝的数据是不会导致新产生的数据的变化的。地址拷贝则是相当于一个地址两个对象吗,那也很自然的修改其中一个变量会导致另一个变量发生变化。
- 可变变量的拷贝都是地址拷贝,不可变变量则是值拷贝。一般对于python来说,可变变量常见的有列表list和字典dict。不可变变量数值类型int、long、bool、float,字符串str,元组tuple。如果我们要对不可变变量进行重新赋值,那实际上就是生成了一个新地址保存数据。
- 接下来我们来说明深拷贝和浅拷贝。二者需要注意的地方就是可变元素的拷贝。对于浅拷贝,拷贝出来的新对象的地址和原对象是不一样的,但是对新对象里面的可变元素的地址和原对象里的可变元素的地址是相同的,即浅拷贝它拷贝的是浅层次的数据结构,对象里的可变元素作为深层数据是不会被拷贝进去的,而是和原对象里的可变元素指向同一个地址。但是深拷贝恰恰相反,会完全拷贝原变量相关的所有数据,直到最后一层,在内存中生成一套完全一样的内容。
- 实现深拷贝的方法很简单,如下:
import copy
a = []
b = copy.deepcopy(a)
对于浅拷贝,有三种方法:使用切片操作,使用工厂函数和使用copy中的copy()函数
import copy
#切片
b = a[:]
#copy()函数
c = copy.copy(a)
#使用工厂函数,u1s1,我不太确定
d = list(a)
a.append(5)
print(a)
print(b)
print(c)
print('*************')
- 最后我想补充一点,就是对于切片操作,也可以对深层元素进行操作,具体就是你打算到第几层,那就带几个切片即可
a = [[[1,2],[3,4]],[[1,2],[3,4]]]
b = a[:][:]
a[0].append([1,2,3,4])
# a.append([1,2,3])
print(a)
print(b)