python的深浅拷贝与linux中的软硬链接
记录一下我对python的深浅拷贝以及linux中的软硬链接的理解
- 放在开头
- 软硬连接
- python中对象的深浅拷贝
- 浅拷贝
- 深拷贝
- copy.copy()对可变和不可变对象的不同
- 总结
放在开头
在学习linux中的软硬链接时,总是无法理解两者之间的区别,为什么创建软链接或者硬链接之后修改其中一个的内容另外一个会随着改变?两者的区别在哪里呢?
后来发现凭借自己硬想根本理解不了,上网搜索了之后也不能理解的太好,果然还是依靠画图的方式来理解才能基本掌握。
后来在学习了python中的深浅拷贝后,突然发现和linux中的软硬链接的概念挺像的,但是后来仔细体会并上机实验,算是稍稍理解里面的区别。在这里就记录一篇博客说说我自己的理解,在以后忘记的时候回来看一看。
软硬连接
话不多说,先上图
我觉得这张图片已经能够很好地反映软硬连接之间的区别了。学过C语言或者linux系统的都应该知道指针的存在,linux中的文件内容与名字之间的关系就如图所示,文件名和文件的数据 是分开存储的,由一个文件名指向文件数据的开始位置(这是它们逻辑上的一个关系,实际上文件名中储存的是文件数据开始位置的地址等信息,这样才能找到文件数据)。
创建软连接的命令为:
ln -s 被链接的源文件(要建立链接的完整路径) 链接文件(链接名)
建立文件的软连接,用通俗的方式讲类似于Windows 下的快捷方式。查看一下快捷方式的属性,可以看到快捷方式中存储的就是文件的完整路径,而并非文件本身。
- 注意
- 没有 -s 选项建立的是一个 硬链接文件,两个文件占用相同大小的硬盘空间,
工作中几乎不会建立文件的硬链接
- 源文件要使用
绝对路径
,不要使用相对路径,这样可以方便移动链接文件后,仍然能够正常使用。
提示:
- 在Linux 中,只有文件的 硬链接数 == 0 才会被删除
- 使用 ls -l 可以查看一个文件的硬链接的数量
- 在日常工作中,几乎不会创建文件的硬链接,知道即可(即使在同一个文件夹中建立的也是软连接而不是硬链接)
特别说明:
软链接实际上只是一段文字,里面包含着它所指向的文件的名字,系统看到软链接后自动跳到对应的文件位置处进行处理;相反,硬联接为文件开设一个新的目录 项,硬链接与文件原有的名字是平权的,在Linux看来它们是等价的。由于这个原因,硬链接不能连接两个不同文件系统上的文件。
(1)软连接可以 跨文件系统 ,硬连接不可以 。实践的方法就是用共享文件把windows下的 aa.txt文本文档连接到linux下/root目录 下 bb,cc . ln -s aa.txt /root/bb 连接成功 。ln aa.txt /root/bb 失败 。
(2)硬连接不管有多少个,都指向的是同一个I节点,会把 结点连接数增加,只要结点的连接数不是 0,文件就一直存在,不管你删除的是源文件还是 连接的文件 。只要有一个存在 ,文件就 存在 (其实也不分什么源文件连接文件的 ,因为他们指向都是同一个 I节点)。 当你修改源文件或者连接文件任何一个的时候 ,其他的文件都会做同步的修改。软链接不直接使用节点号作为文件指针,而是使用文件路径名作为指针。所以 删除连接文件 对源文件无影响,但是删除源文件,连接文件就会找不到要指向的文件 。软链接有自己的inode,并在磁盘上有一小片空间存放路径名.
(3)软连接可以对一个不存在的文件名进行连接 。
(4)软连接可以对目录进行连接。
python中对象的深浅拷贝
如果能够理解了linux中的软硬链接,那么对于python中深浅拷贝的理解就能够相对容易些,结合上面的图片理解将会理解的更加透彻。
这篇博客中讲的已经很全面了,我就不再列举例子了,只是讲讲自己的理解。
浅拷贝
python中的浅拷贝,也就是使用赋值号(=)创建的新对象就属于浅拷贝,浅拷贝与linux中的硬连接非常相似,通俗地讲就是:拷贝了引用,并没有拷贝内容。但是浅拷贝与硬链接的一点区别就是修改(指的是对变量进行赋值操作)其中一个变量的值,另一个变量的值不会改变,因为修改变量的值改的是变量的引用而不是变量所指向内存的内容,如图一所示
对b进行append操作时如图二所示,对a或者b进行append操作时,另外的变量也会随之改变。
深拷贝
python实现深拷贝依靠的copy模块,copy模块中有两种深拷贝copy.copy()和copy.deepcopy(),两者之间也有一些区别。我觉得copy.copy()属于不完全的拷贝,而copy.deepcopy()属于完全的拷贝。使用copy.deepcopy()之后生成的变量与原变量之间没有任何关系,属于那种你有的我都有,而你没有了我还是可以有的关系。copy.deepcopy()理解起来不是很难,我就着重说说对copy.copy()的理解。
如图三所示,使用copy.copy()后,d会重新开辟一快新的内存,但是内存中存储的是a、b的引用,当d添加一个元素2时,c不受d的影响,但是当a添加一个元素4时,c和d都会受到影响,就是因为c和d中存储的是a和b的引用。
PS: 为什么要使用c=[a,b]呢?因为使用具体的数根本看不出效果,如果写c=[[1,2,3],[4,5,6]],修改c[1]的值修改的是引用,并不会修改原来引用的内容。
copy.copy()对可变和不可变对象的不同
- 可变类型使用copy
import copy
a = [1,2,3]
b = copy.copy(a)
print(id(a))
print(id(b))a.append(4)
print(a)
print(b)
运行结果为:
1626677717832
1626677715784
[1, 2, 3, 4]
[1, 2, 3]
- 不可变类型使用copy
import copy
a = (1,2,3)
b = copy.copy(a)
print(id(a))
print(id(b))
运行结果为:
2043444280704
2043444280704
总结
- 简单的赋值是浅拷贝
- copy模块里面的copy()函数可以做一层深拷贝,虽然重新开辟了新的内存,但新内存里面仍然存放得是原来的引用,
- copy模块中的deepcopy()函数是深拷贝,重新开辟了了内存,而且内存中保存了新的值
文中都是我个人的理解,如有错误的地方欢迎下方评论告诉我,我及时更正,大家共同进步
python的深浅拷贝与linux中的软硬链接相关推荐
- python集合类型应用场景_简述Python的深浅拷贝以及应用场景
原博文 2019-07-16 11:54 − Python的深浅拷贝以及应用场景 深浅拷贝用法来自copy模块. 导入模块:import copy 浅拷贝:copy.copy 深拷贝:copy.dee ...
- Linux中的软硬连接
Linux中的软硬连接 Linux中的连接被分为软连接和硬连接,软连接又被称为符号连接.这种连接操作实际上是给系统中已有的某个文件指定另外一个可用于访问它的名称.对于这个新的文件名,我们可以为之指定不 ...
- 在linux中下载迅雷链接(thunder://)
在linux中下载迅雷链接(thunder://) 迅雷下载协议是经过加密的,如: thunder://QUFodHRwOi8vd3d3LmNub3N3aWtpLmNvbS93cC1jb250ZW50 ...
- python之深浅拷贝
对于 数字 和 字符串 而言,赋值.浅拷贝和深拷贝无意义,因为其永远指向同一个内存地址. import copy # ######### 数字.字符串 ######### n1 = 123 # n1 ...
- Python的深浅拷贝讲解!
↑↑↑关注后"星标"Datawhale 每日干货 & 每月组队学习,不错过 Datawhale干货 作者:皮钱超,厦门大学,Datawhale原创作者 本文约3000字,建 ...
- 【Python基础】Python的深浅拷贝讲解
点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 前言 在很多语言中都存在深浅拷贝两种拷贝数据的方式,Python中 ...
- 【python】深浅拷贝
在python中一切都是对象 print(type(1))print(type("Hello World"))print(type(["A","B&q ...
- day2学python 数据类型+深浅拷贝+循环
数据类型+深浅拷贝+循环 别的语言的数组 python不用定义 直接使用 color=['红','橙','黄','绿','青','蓝','紫']print(color[1:3]) //打印[1,3)的 ...
- python绘图颜色深浅代表数值_画图理解Python的深浅拷贝
在平常运维工作中,难免会有一些修改服务配置文件的操作,为了安全和可以回滚起见,我们习惯性的会将源配置文件做一个拷贝,这样以来即便配置文件参数被修改错了也没事,可以快速从备份的副本还原回来. 同样,在 ...
最新文章
- hdu 5451 Best Solver 矩阵循环群+矩阵快速幂
- 反思PHP多个字符串函数
- JS表情替换代码,这里使用字符代替图片路径
- WPF Application启动界面设置——
- 2018四川高考文科21题
- 神奇的margin之豆瓣豆瓣么么哒
- PHP7.1 狐教程【旧】不在更新,请点击新连接查看
- iOS dSYM小结
- 对称加密与非对称加密算法
- 机械硬盘如何克隆至固态硬盘,如何把硬盘系统克隆到固态硬盘
- 计算机存储容量1tb等于多少,1tb等于多少mb(1tb等于多少gb)
- OpenCvSharp 棋盘格标定助手
- 检测电路故障c语言,常见的几种电路故障
- 基于51单片机的单电源函数信号发生器设计仿真原理图方案
- mysql 数据文件_mysql的数据文件
- Redis set 类型 查询命令
- mb63.nte.ios.html,2009 Diagnosis, assessment, and treatment of non-pulmonary arterial hypertension
- css-doodle 学习第二天,css-doodle能怎么使用
- 网络安全——SQL注入攻击
- 几何画板动画制作教程,一看就会。