转:Python中的一些概念:变量、对象、赋值、引用、浅拷贝、深拷贝

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的所有层的所有元素对象都重新做一份(即开辟新的内存空间,建立新对象)。

 

posted @ 2022-02-23 21:33  Picassooo  阅读(104)  评论(0)    收藏  举报