Python基础之赋值,浅拷贝,深拷贝的区别
作者:心烦啊 发布时间:2021-06-28 18:39:15
一、赋值
不会开辟新的内存空间,只是复制了新对象的引用。所以当一个数据发生变化时,另外一个数据也会随之改变。
二、浅拷贝
创建新对象,其内容是对原对象的引用。浅拷贝之所以称为浅拷贝,是因为它仅仅只拷贝了第一层,即只拷贝了最外层的对象本身,内部的元素都只是拷贝了一个引用而已,即内部元素如果被修改,则另外一个数据也会发生变化。
浅拷贝的三种形式:
A = [1, 2, 3, 4]
切片操作
# 第1种
B = A[:]
# 第2种
B = [a for a in A]
工厂函数
B = list(A)
copy函数
B = copy.copy(A)
浅拷贝要分两种情况进行讨论:
1)当浅拷贝的值是不可变对象(例如字符串、元组、数值类型)时,和赋值情况一样,对象的内存地址(id())与浅拷贝原来的值一致。
2)当浅拷贝的值是可变对象(例如列表、字典、集合等)时,也需要分两种情况讨论:
首先,原来值的内存地址与拷贝后的内存地址不同。
当要拷贝的对象里面,没有可变的子对象时,原来值(拷贝值)的改变并不会影响拷贝值(原来值)。
当要拷贝的对象里面,有可以改变的子对象时,改变该子对象,原来值和拷贝值之间会互相影响。
三、深拷贝
深拷贝拷贝出来的对象是一个全新的对象,和原来的对象没有任何的关联。改变原有对象不会影响新的拷贝对象。
四、例子
不可变对象
import copy
# 不可变对象
# A = (1, 2, 'hello') # 元组
# A = 1 # 数值
A = 'hello' # 字符串
print("********赋值********")
B = A
print(id(A))
print(id(B))
print(A)
print(B)
print("********浅拷贝********")
B = copy.copy(A)
print(id(A))
print(id(B))
print(A)
print(B)
print("********深拷贝********")
B = copy.deepcopy(A)
print(id(A))
print(id(B))
print(A)
print(B)
结果:
********赋值********
1894005658264
1894005658264
hello
hello
********浅拷贝********
1894005658264
1894005658264
hello
hello
********深拷贝********
1894005658264
1894005658264
hello
hello
可变对象
import copy
# 可变对象
A = [1, 2, 3]
print("********赋值********")
B = A
print(id(A))
print(id(B))
print(A)
print(B)
print("********浅拷贝********")
B = copy.copy(A)
print(id(A))
print(id(B))
print(A)
print(B)
print("********深拷贝********")
B = copy.deepcopy(A)
print(id(A))
print(id(B))
print(A)
print(B)
结果:
********赋值********
1602694308360
1602694308360
[1, 2, 3]
[1, 2, 3]
********浅拷贝********
1602694308360
1602694308424
[1, 2, 3]
[1, 2, 3]
********深拷贝********
1602694308360
1602950316296
[1, 2, 3]
[1, 2, 3]
可变对象修改外层
import copy
# 可变对象
A = [1, 2, 3, [11, 10, 20]]
# 可变对象的外层修改
B1 = A # 赋值
B2 = copy.copy(A) # 浅拷贝
B3 = copy.deepcopy(A) # 深拷贝
A.append(4)
print("********赋值********")
print(id(A))
print(id(B1))
print(A)
print(B1)
print("********浅拷贝********")
print(id(A))
print(id(B2))
print(A)
print(B2)
print("********深拷贝********")
print(id(A))
print(id(B3))
print(A)
print(B3)
结果:
********赋值********
2215309238856
2215309238856
[1, 2, 3, [11, 10, 20], 4]
[1, 2, 3, [11, 10, 20], 4]
********浅拷贝********
2215309238856
2215593496776
[1, 2, 3, [11, 10, 20], 4]
[1, 2, 3, [11, 10, 20]]
********深拷贝********
2215309238856
2215593518024
[1, 2, 3, [11, 10, 20], 4]
[1, 2, 3, [11, 10, 20]]
可变对象修改内层
import copy
# 可变对象
A = [1, 2, 3, [11, 10, 20]]
# 可变对象的内层修改
B1 = A # 赋值
B2 = copy.copy(A) # 浅拷贝
B3 = copy.deepcopy(A) # 深拷贝
A[3].append(4)
print("********赋值********")
print(id(A))
print(id(B1))
print(A)
print(B1)
print("********浅拷贝********")
print(id(A))
print(id(B2))
print(A)
print(B2)
print("********深拷贝********")
print(id(A))
print(id(B3))
print(A)
print(B3)
结果
********赋值********
2288591069768
2288591069768
[1, 2, 3, [11, 10, 20, 4]]
[1, 2, 3, [11, 10, 20, 4]]
********浅拷贝********
2288591069768
2288847138760
[1, 2, 3, [11, 10, 20, 4]]
[1, 2, 3, [11, 10, 20, 4]]
********深拷贝********
2288591069768
2288847168264
[1, 2, 3, [11, 10, 20, 4]]
[1, 2, 3, [11, 10, 20]]
来源:https://blog.csdn.net/qq_41447478/article/details/116263864
猜你喜欢
- SCRIPT 标记 用于包含JavaScript代码. 属性 LANGUAGE&nbs
- 出现的问题状况是:在Anaconda文件下,少了Jupyter Notebook快捷键,不然每次都要打开Anaconda Navigator
- ACCESS数据库中Field对象的caption属性(也就是标题)是用来设置数据字段的标题,在正常的数据库设计中为了保持维护的便利性,许多
- Matplotlib简介Matplotlib是非常强大的python画图工具Matplotlib可以画图线图、散点图、等高线图、条形图、柱形
- 1. 原理简介原理很简单,就是获取视频资源的源地址,然后爬取视频的二进制内容,再写入到本地即可。2. 网页分析打开该网页,然后F12进入开发
- ltp是哈工大出品的自然语言处理工具箱, pyltp是python下对ltp(c++)的封装.在linux下我们很容易的安装pyltp, 因
- 最近在折腾Python Web,在测试的时候发现,本机可以正常访问,但外网无法通过公网IP访问页面。经过各种搜索,有大致三种解决方案。一、修
- 下表列出了所有Python语言支持的成员运算符。 例如:试试下面的例子就明白了所有的Python编程语言提供会员运算符:#!/us
- 使用cv2.imread(),cv2.imshow(),cv2.imwrite()读取、显示和保存图像一、读入图像使用函数cv2.imrea
- PHP 过滤器PHP 过滤器用于验证和过滤来自非安全来源的数据,比如用户的输入。什么是 PHP 过滤器PHP 过滤器用于验证和过滤来自非安全
- 说到网络产品,离不开的话题就是用户,就像传统行业的消费者。人是复杂的,网民的用户行为更加复杂,用户和用户是不一样的,或者说,每个用户都不一样
- Python列表具有内置的 list.sort()方法,可以在原地修改列表。 还有一个 sorted()内置的函数从迭代构建一个新的排序列表
- 引言:闲来想到冒泡排序中的列表数据的排序,就想试试用随机数生成一个列表来排序试试,于是做了一下实验,本人实在是属于入门阶段,研究了一下终究还
- strip_tags定义和用法strip_tags() 函数剥去字符串中的 HTML、XML 以及 PHP 的标签。注释:该函数始终会剥离
- 本文实例讲述了Python爬取国外天气预报网站的方法。分享给大家供大家参考。具体如下:crawl_weather.py如下:#encodin
- 网页离不开链接,而默认链接的表现形式总是千篇一律的蓝色文字加底线,每当我们点击它时,周围会出现虚线框,表示该链接是当前的焦点,影
- 无法远程登入MySQL数据库的几种解决办法方法一:尝试用MySQL Adminstrator GUI Tool登入MySQL Server,
- 前言在开发过程中,很多应用程序都需要通过邮件提醒用户, Flask 的扩展包 Flask - Mail 通过包装了 Python 内置的sm
- 两个例子package main import ( "fmt" "time")func Proces
- editTable.js 提供编辑表格当前行、添加一行、删除当前行的操作,其中可以设置参数,如:operatePos 用于设置放置操作的列,