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

Python彻底搞懂:变量、对象、赋值、引用、拷贝(知乎,推荐)

Python 中变量赋值传递时的引用和拷贝

 

 

变量是一个系统表的元素,拥有指向对象的连接的空间。

对象是分配的一块内存,有足够的空间去表示它们所代表的值。

引用是自动形成的从变量到对象的指针。

赋值是指建立变量和对象之间链接(引用)。

本质上,可以说 Python 没有赋值,只有引用。

Python中,我们平时所说的变量其实只是「标签」,是引用。

 

浅拷贝包括切片操作,工厂函数,copy库中的copy函数等

  • 对于可变对象,浅拷贝和赋值一样,拷贝的是对象的引用,所以指向的是同一个对象,即id相同。
  • 对于不可变对象,浅拷贝会拷贝第一层对象,不会拷贝对象内部的子对象。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# ========== 不可变对象的赋值和浅拷贝示例 ===========
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不同的元素对象),对于第二层的元素对象,不会重新做一份,而是建立引用,例如:

1
2
3
a = [0, [1, 2], 3]
 
b = a[:]   # 这是浅拷贝操作

示意图如下:

深拷贝是指对列表a的所有层的所有元素对象都重新做一份(即开辟新的内存空间,建立新对象)。

 

posted @   Picassooo  阅读(94)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· .NET10 - 预览版1新功能体验(一)
历史上的今天:
2020-02-23 转:简单例子说明梯度下降、momentum和学习率衰减
点击右上角即可分享
微信分享提示