转:Python中的一些概念:变量、对象、赋值、引用、浅拷贝、深拷贝
Python彻底搞懂:变量、对象、赋值、引用、拷贝(知乎,推荐)
变量是一个系统表的元素,拥有指向对象的连接的空间。
对象是分配的一块内存,有足够的空间去表示它们所代表的值。
引用是自动形成的从变量到对象的指针。
赋值是指建立变量和对象之间链接(引用)。
本质上,可以说 Python 没有赋值,只有引用。
Python中,我们平时所说的变量其实只是「标签」,是引用。
浅拷贝包括切片操作,工厂函数,copy库中的copy函数等
- 对于可变对象,浅拷贝和赋值一样,拷贝的是对象的引用,所以指向的是同一个对象,即id相同。
- 对于不可变对象,浅拷贝会拷贝第一层对象,不会拷贝对象内部的子对象。
# ========== 不可变对象的赋值和浅拷贝示例 =========== a = 'vivo' b = a # 赋值操作 c = a[:] # 切片操作,浅拷贝 print(id(a)) # 输出:2630828485296 print(id(b)) # 输出:2630828485296 print(id(c)) # 输出:2630828485296 # ======== 可变对象的赋值、浅拷贝和深拷贝示例 ========= from copy import deepcopy f = [0, [1, 2], 3] g = f h = f[:] # 浅拷贝 w = deepcopy(f) # 深拷贝 f[0] = 8 f[1][1] = 9 print(f, id(f)) # 输出:[8, [1, 9], 3] 2038472791112 print(g, id(g)) # 输出:[8, [1, 9], 3] 2038472791112 print(h, id(h)) # 输出:[0, [1, 9], 3] 2038466133640 print(w, id(w)) # 输出:[0, [1, 2], 3] 2038471134536
list中的一个个元素是一个个对象,list是可变对象,意思是每个元素替换为其他对象,整个的list对象的id不变。
以一个两层列表a(如下图所示)来说明浅拷贝和深拷贝,浅拷贝的意思是,只对列表第一层的元素对象进行复制(即对第一层的每个元素对象,开辟新的内存空间,完全重新做一份id不同的元素对象),对于第二层的元素对象,不会重新做一份,而是建立引用,例如:
a = [0, [1, 2], 3] b = a[:] # 这是浅拷贝操作
示意图如下:
深拷贝是指对列表a的所有层的所有元素对象都重新做一份(即开辟新的内存空间,建立新对象)。