彻底理解Python中浅拷贝和深拷贝的区别

news2025/1/11 14:04:08

目录

前言

1. 浅拷贝和深拷贝的概念

2. is和==的区别

3. 赋值操作

4. copy模块里面的copy()方法

5. copy模块里面的deepcopy()方法

6.字典自带的copy方法

7.切片表达式拷贝


前言

Python 的所有变量其实都是指向内存中的对象的一个指针,这确实和之前学过的强类型语言(Java)是有不同的。因为变量是指针,所以所有的变量无类型限制,可以指向任意对象。指针的内存空间大小是与类型无关的,其内存空间只是保存了所指向数据的内存地址。

对象还分两类:一类是可修改的,一类是不可修改的。可修改(mutable)的类型叫做值类型,不可修改(immutable)类型叫做引用类型。

不可变(immutable)对象类型

int,float,decimal,complex,bool,str,tuple,range,frozenset,bytes

可变(mutable)对象类型

list,dict,set,bytearray,user-defined classes (unless specifically made immutable)

为了探索对象在内存的存储,我们可以求助于Python的内置函数id()。它用于返回对象的身份(唯一标识符,标识符是一个整数)其实,这里所谓的身份,就是该对象的内存地址。

a = 1

print(id(a))

print(hex(id(a)))

在我的计算机上,它们返回的是:

11246696 '0xab9c68'

分别为内存地址的十进制和十六进制表示。

1. 浅拷贝和深拷贝的概念

以下分别是百度百科对浅拷贝和深拷贝的定义:

浅拷贝:

浅拷贝是按位拷贝对象,它会创建一个新对象,这个对象有着原始对象属性值的一份精确拷贝。如果属性是基本类型,拷贝的就是基本类型的值;如果属性是内存地址(引用类型),拷贝的就是内存地址 ,因此如果其中一个对象改变了这个地址,就会影响到另一个对象。即默认拷贝构造函数只是对对象进行浅拷贝复制(逐个成员依次拷贝),即只复制对象空间而不复制资源。

深拷贝:

深拷贝会拷贝所有的属性,并拷贝属性指向的动态分配的内存。当对象和它所引用的对象一起拷贝时即发生深拷贝。源对象与拷贝对象互相独立,其中任何一个对象的改动都不会对另外一个对象造成影响。深拷贝相比于浅拷贝速度较慢并且花销较大。

简单说就是:

浅拷贝只复制某个对象的引用,而不复制对象本身,新旧对象还是共享同一块内存。

深拷贝会创造一个一摸一样的对象,新对象和原对象不共享内存,修改新对象不会改变原对对象。

在python中

浅拷贝(copy()):拷贝父对象,不会拷贝对象内部的子对象。

深拷贝(deepcopy()):是copy模块中的方法,完全拷贝了子对象和父对象

2. is和==的区别

python是一种面向对象的语言,python中对象包含三种基本要素:id(返回的是对象的地址)、type(返回的是对象的数据类型)及value(对象的值)。

is和==都可以对两个对象进行比较,而且它们的返回值都是布尔类型。但是它们比较的内容是不同的,不然两个函数的作用就重复了。首先我们来看下例子,从实际操作中来看下二者的区别。

 从上面的例子可以得出,is和==比较的对象的内容时不同的,即:is比较的是两个对象的地址值,也就是说两个对象是否为同一个实例对象;而==比较的是对象的值是否相等,其调用了对象的__eq__()方法。

那么怎么才能让两个对象的地址值相等呢,如果想让一个对象ls2 is ls1返回True应该怎么操作呢,我们可以把ls1赋值给ls2,这样ls1和ls2指向的就是同一个内存地址,ls1 == ls2和ls1 is ls2返回的都是True。如下图所示:
 

3. 赋值操作

在上面提到了赋值操作, 在python中对象赋值实际上是对象的引用。当创建一个对象,然后把它赋值给另一个变量的时候,python并没有拷贝这个对象,而只是拷贝了这个对象的引用。

ls1 = ls赋值引用,ls1和ls都指向同一个对象。内存图如下所示: 

 

综上,赋值操作只是浅拷贝传递对象的引用而已,原始列表改变,被赋值的变量也会做相同的改变,所以属于浅拷贝。

前面讲到python中分为可变类型和不可变类型,下面分别按照这2种类型介绍浅拷贝和深拷贝。

4. copy模块里面的copy()方法

可变类型和不可变类型在浅拷贝中的区别

# coding=utf-8

import copy

'''
不可变类型Number String Tuple
'''
num1 = 17
num2 = copy.copy(num1)

print("num1:" + str(id(num1)))
print("num2:" + str(id(num1)))
# num1和num2的地址都相同


str1 = "hello"
str2 = copy.copy(str1)
print("str1:" + str(id(str1)))
print("str2:" + str(id(str2)))
# str1和str2的地址都相同

tup1 = (18, "tom")
tup2 = copy.copy(tup1)
print("tup1:" + str(id(tup1)))
print("tup2:" + str(id(tup2)))
# tup1和tup2的地址都相同


'''
可变类型List、Dictionary、Set
'''
list1 = [11,12]
list2 = copy.copy(list1)
print("list1:" + str(id(list1)))
print("list2:" + str(id(list2)))
# list1和list2的地址不相同


dic1 = {"key": "hello", "num": 18}
dic2 = copy.copy(dic1)
print("dic1:" + str(id(dic1)))
print("dic2:" + str(id(dic2)))
# dic1和dic2的地址不相同

set1 = {"AA","BB"}
set2 = copy.copy(set1)
print("set1:" + str(id(set1)))
print("set2:" + str(id(set2)))
# set1和set2的地址不相同



输出结果:
num1:58549080
num2:58549080
str1:60653712
str2:60653712
tup1:60127112
tup2:60127112
list1:60101000
list2:60190344
dic1:60203624
dic2:60205528
set1:60064936
set2:60064712

从以上输出结果可以看到:

  • 对于不可变类型 Number String Tuple,浅复制仅仅是地址指向,不会开辟新空间拷贝值
  • 对于可变类型 List、Dictionary、Set,浅复制会开辟新的空间地址,进行浅拷贝

那如果对对象作出修改操作呢?

1)最外层的数据类型是不可变的,内层数据是可变的

import copy

'''
最外层的数据类型是不可变的,内层数据是可变的
'''
a=[34, 56]
b=[89, 37]
c=(a, b)
d=copy.copy(c)
print("c: %s" % str(c))
print("d: %s" % str(d))

print("id(a): %s" % id(a))
print("id(b): %s" % id(b))
print("id(c): %s" % id(c))
print("id(d): %s" % id(d))

print("id(c[0]): %s" % id(c[0]))
print("id(c[1]): %s" % id(c[1]))
print("id(d[0]): %s" % id(d[0]))
print("id(d[1]): %s" % id(d[1]))

a.append(90)
print("c: %s" % str(c))
print("d: %s" % str(d))


输出结果:
c: ([34, 56], [89, 37])
d: ([34, 56], [89, 37])
id(a): 56627592
id(b): 56639880
id(c): 56640648
id(d): 56640648
id(c[0]): 56627592
id(c[1]): 56639880
id(d[0]): 56627592
id(d[1]): 56639880
c: ([34, 56, 90], [89, 37])
d: ([34, 56, 90], [89, 37])

从以上输出结果可以看到,c=(a, b)的最外层是元组不可变类型,d在进行浅拷贝的时候,是直接引用c的地址,而不是再开辟新的地址空间存放。c=(a, b)的内层是列表可变类型,d在进行浅拷贝的时候,内层元素是引用的a和b的地址,也没有开辟新的地址空间存放。当a发生变化后,d也随之发生了变更。

2)最外层的数据类型是不可变的,内层数据也是不可变的

import copy

'''
最外层的数据类型是不可变的,内层数据也是不可变的
'''
a=(34, 56)
b=(89, 37)
c=(a, b)
d=copy.copy(c)
print("c: %s" % str(c))
print("d: %s" % str(d))

print("id(a): %s" % id(a))
print("id(b): %s" % id(b))
print("id(c): %s" % id(c))
print("id(d): %s" % id(d))

print("id(c[0]): %s" % id(c[0]))
print("id(c[1]): %s" % id(c[1]))
print("id(d[0]): %s" % id(d[0]))
print("id(d[1]): %s" % id(d[1]))


输出结果:
c: ((34, 56), (89, 37))
d: ((34, 56), (89, 37))
id(a): 59722120
id(b): 59722184
id(c): 59720840
id(d): 59720840
id(c[0]): 59722120
id(c[1]): 59722184
id(d[0]): 59722120
id(d[1]): 59722184

从以上输出结果可以看到,c=(a, b)的最外层是元组不可变类型,d在进行浅拷贝的时候,是直接引用c的地址,而不是再开辟新的地址空间存放。c=(a, b)的内层是不可变类型,d在进行浅拷贝的时候,内层元素是引用的a和b的地址,也没有开辟新的地址空间存放。

3)最外层的数据类型是可变的,内层数据也是可变的

import copy

'''
最外层的数据类型是可变的,内层数据也是可变的
'''
a=[34, 56]
b=[89, 37]
c=[a, b]
d=copy.copy(c)
print("c: %s" % c)
print("d: %s" % d)

print("id(a): %s" % id(a))
print("id(b): %s" % id(b))
print("id(c): %s" % id(c))
print("id(d): %s" % id(d))
print("id(d[0]): %s" % id(d[0]))
print("id(d[1]): %s" % id(d[1]))

a.append(90)
print("c: %s" % c)
print("d: %s" % d)


输出结果:
c: [[34, 56], [89, 37]]
d: [[34, 56], [89, 37]]
id(a): 59249032
id(b): 59261320
id(c): 59263624
id(d): 59338568
id(d[0]): 59249032
id(d[1]): 59261320
c: [[34, 56, 90], [89, 37]]
d: [[34, 56, 90], [89, 37]]

从以上输出结果可以看到,c=(a, b)的最外层是列表可变类型,d在进行浅拷贝的时候,是开辟了新的地址空间存放。c=(a, b)的内层是列表可变类型,d在进行浅拷贝的时候,内层元素是引用的a和b的地址,而没有开辟新的地址空间存放。当a发生变化后,d也随之发生了变更。

4)最外层的数据类型是可变的,内层数据是不可变的

import copy

'''
浅拷贝是对一个对象父级(外层)的拷贝,并不会拷贝子级(内部)。
最外层的数据类型是可变的,内层数据是不可变的
'''
a=(34, 56)
b=(89, 37)
c=[a, b]
d=copy.copy(c)
print("c: %s" % c)
print("d: %s" % d)

print("id(a): %s" % id(a))
print("id(b): %s" % id(b))
print("id(c): %s" % id(c))
print("id(d): %s" % id(d))
print("id(d[0]): %s" % id(d[0]))
print("id(d[1]): %s" % id(d[1]))


输出结果:
c: [(34, 56), (89, 37)]
d: [(34, 56), (89, 37)]
id(a): 52381896
id(b): 52381960
id(c): 52367752
id(d): 52448968
id(d[0]): 52381896
id(d[1]): 52381960

从以上输出结果可以看到,c=(a, b)的最外层是列表可变类型,d在进行浅拷贝的时候,是开辟了新的地址空间存放。c=(a, b)的内层是不可变类型,d在进行浅拷贝的时候,内层元素是引用的a和b的地址,而没有开辟新的地址空间存放。

综上,可以得出结论:

浅拷贝是对一个对象父级(外层)的拷贝,并不会拷贝子级(内部)。使用浅拷贝的时候,分为两种情况。
第一种,如果最外层的数据类型是可变的,比如说列表,字典等,浅拷贝会开启新的地址空间去存放。
第二种,如果最外层的数据类型是不可变的,比如元组,字符串等,浅拷贝对象的时候,还是引用对象的地址空间。

 

5. copy模块里面的deepcopy()方法

1)最外层的数据类型是不可变的,内层数据是可变的

import copy

'''
最外层的数据类型是不可变的,内层数据是可变的
'''
a=[34, 56]
b=[89, 37]
c=(a, b)
d=copy.deepcopy(c)
print("c: %s" % str(c))
print("d: %s" % str(d))

print("id(a): %s" % id(a))
print("id(b): %s" % id(b))
print("id(c): %s" % id(c))
print("id(d): %s" % id(d))

print("id(c[0]): %s" % id(c[0]))
print("id(c[1]): %s" % id(c[1]))
print("id(d[0]): %s" % id(d[0]))
print("id(d[1]): %s" % id(d[1]))

a.append(90)
print("c: %s" % str(c))
print("d: %s" % str(d))


输出结果:
c: ([34, 56], [89, 37])
d: ([34, 56], [89, 37])
id(a): 52367752
id(b): 52380040
id(c): 52380808
id(d): 52380872
id(c[0]): 52367752
id(c[1]): 52380040
id(d[0]): 52382472
id(d[1]): 52457160
c: ([34, 56, 90], [89, 37])
d: ([34, 56], [89, 37])

从以上输出结果可以看到,c=(a, b)的最外层是元组不可变类型,d在进行深拷贝的时候,是开辟了新的地址空间存放。c=(a, b)的内层是列表可变类型,d在进行深拷贝的时候,内层元素也开辟了新的地址空间存放。当a发生变化后,d并没有发生变更。

2)最外层的数据类型是不可变的,内层数据也是不可变的

import copy

'''
最外层的数据类型是不可变的,内层数据也是不可变的
'''
a=(34, 56)
b=(89, 37)
c=(a, b)
d=copy.deepcopy(c)
print("c: %s" % str(c))
print("d: %s" % str(d))

print("id(a): %s" % id(a))
print("id(b): %s" % id(b))
print("id(c): %s" % id(c))
print("id(d): %s" % id(d))

print("id(c[0]): %s" % id(c[0]))
print("id(c[1]): %s" % id(c[1]))
print("id(d[0]): %s" % id(d[0]))
print("id(d[1]): %s" % id(d[1]))


输出结果:
c: ((34, 56), (89, 37))
d: ((34, 56), (89, 37))
id(a): 48187848
id(b): 48187912
id(c): 48186504
id(d): 48186504
id(c[0]): 48187848
id(c[1]): 48187912
id(d[0]): 48187848
id(d[1]): 48187912

从以上输出结果可以看到,c=(a, b)的最外层是元组不可变类型,d在进行深拷贝的时候,是开辟了新的地址空间存放。c=(a, b)的内层是不可变类型,d在进行深拷贝的时候,内层元素是引用的a和b的地址,而没有开辟新的地址空间存放。

3)最外层的数据类型是可变的,内层数据也是可变的

import copy

'''
最外层的数据类型是可变的,内层数据也是可变的
'''
a=[34, 56]
b=[89, 37]
c=[a, b]
d=copy.deepcopy(c)
print("c: %s" % c)
print("d: %s" % d)

print("id(a): %s" % id(a))
print("id(b): %s" % id(b))
print("id(c): %s" % id(c))
print("id(d): %s" % id(d))
print("id(d[0]): %s" % id(d[0]))
print("id(d[1]): %s" % id(d[1]))

a.append(90)
print("c: %s" % c)
print("d: %s" % d)


输出结果:
c: [[34, 56], [89, 37]]
d: [[34, 56], [89, 37]]
id(a): 59380104
id(b): 59392392
id(c): 59394696
id(d): 59394824
id(d[0]): 59469512
id(d[1]): 59469768
c: [[34, 56, 90], [89, 37]]
d: [[34, 56], [89, 37]]

从以上输出结果可以看到,c=(a, b)的最外层是列表可变类型,d在进行深拷贝的时候,是开辟了新的地址空间存放。c=(a, b)的内层是列表可变类型,d在进行深拷贝的时候,内层元素也开辟了新的地址空间存放。当a发生变化后,d并没有发生变更。

4)最外层的数据类型是可变的,内层数据是不可变的

import copy

'''
浅拷贝是对一个对象父级(外层)的拷贝,并不会拷贝子级(内部)。
最外层的数据类型是可变的,内层数据是不可变的
'''
a=(34, 56)
b=(89, 37)
c=[a, b]
d=copy.deepcopy(c)
print("c: %s" % c)
print("d: %s" % d)

print("id(a): %s" % id(a))
print("id(b): %s" % id(b))
print("id(c): %s" % id(c))
print("id(d): %s" % id(d))
print("id(d[0]): %s" % id(d[0]))
print("id(d[1]): %s" % id(d[1]))


输出结果:
c: [(34, 56), (89, 37)]
d: [(34, 56), (89, 37)]
id(a): 45041928
id(b): 45041992
id(c): 45027720
id(d): 45040008
id(d[0]): 45041928
id(d[1]): 45041992

从以上输出结果可以看到,c=(a, b)的最外层是列表可变类型,d在进行深拷贝的时候,是开辟了新的地址空间存放。c=(a, b)的内层是不可变类型,d在进行深拷贝的时候,内层元素是引用的a和b的地址,而没有开辟新的地址空间存放。

综上,可以得出结论:

深拷贝对一个对象是所有层次的拷贝(递归),内部和外部都会被拷贝过来。
深拷贝也分两种情况:
第一种,最外层数据类型可变。外部的都会拷贝过来。如果里面是可变数据类型,会新开辟地址空间存放。如果内部数据类型不可变,才会如同浅拷贝一样,是对地址的引用。
第二种,外层数据类型不可变,如果里面是可变数据类型,外部和内部都会新开辟地址空间存放。如果内部数据类型不可变,外部和内部都是对地址的引用。

6.字典自带的copy方法

dict_1 = {"key1":[1,2,3,4],"key2":"val2"}
dict_2 = dict_1.copy()
dict_1["key1"].append(5)
print("id(dict_1)",id(dict_1),id(dict_1["key1"]),dict_1)
print("id(dict_2)",id(dict_2),id(dict_1["key1"]),dict_2)


输出结果:
('id(dict_1)', 43262840L, 48538120L, {'key2': 'val2', 'key1': [1, 2, 3, 4, 5]})
('id(dict_2)', 48598552L, 48538120L, {'key2': 'val2', 'key1': [1, 2, 3, 4, 5]})

可以看出,父对象被拷贝到了一个新内存地址,但是对于子对象只是引用了它的内存地址,并没有拷贝子对象里面可迭代的内容。如果子对象里面的内容修改后,被赋值的变量也会做相同的改变,所以字典中的copy方法属于浅拷贝

7.切片表达式拷贝

num1 = [1, 2, 3, [4, 5]]
num2 = num1[:]
num1[0] = 0
num1.append(5)
num1[3].append(6)
print(num1, id(num1))
print(num2, id(num2))
print(num1[3], id(num1[3]))
print(num2[3], id(num2[3]))


输出结果:
([0, 2, 3, [4, 5, 6], 5], 57012616L)
([1, 2, 3, [4, 5, 6]], 57012744L)
([4, 5, 6], 57000328L)
([4, 5, 6], 57000328L)

由此可见,切片操作并没有复制可变类型的元素而是复制了可变类型的地址相当于浅拷贝。

参考文章:

python之浅拷贝和深拷贝的区别_埃菲尔没有塔尖的博客-CSDN博客_python 深拷贝和浅拷贝的区别

Python之中切片是浅拷贝吗?Python怎么实现浅拷贝 - 优草派

python赋值、深拷贝和浅拷贝的区别详解_测试小白00的博客-CSDN博客_python赋值和浅拷贝

python中的is和==区别_Tonywu2018的博客-CSDN博客_python is和==的区别

python3浅拷贝与深拷贝的区别和理解 - 简书

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/76516.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JDBC基本使用(第一个jdbc程序)

在web开发中,不可避免的地要使用数据库来存储和管理数据。为了在java语言中提供数据库访问的支持,Sun公司于1996年提供了一套访问数据的标准Java类库,即JDBC。 JDBC的全称是Java数据库连接(Java Database connect),它是一套用于执…

Web3中文|AI机器人ChatGPT如何看待DeFi?

如果还没有玩过OpenAI最新的聊天机器人ChatGPT,那您真的应该体验一下。 从电影推介到编程查询,ChatGPT几乎可以对您向它提出的任何提示做出类似人类的逻辑响应。这种新奇的感觉就像乔布斯第一次滑动解锁iPhone屏幕时那样。 与加密货币一样,…

nacos配置在代码中如何引用

1、在代码的模块服务中安装nacos 配置依赖 <dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId></dependency>2、在nacos配置中心中进行服务配置 注意不是模块名&#…

LeetCode刷题复盘笔记—一文搞懂动态规划之213. 打家劫舍 II问题(动态规划系列第十八)

今日主要总结一下动态规划完全背包的一道题目&#xff0c;213. 打家劫舍 II 题目&#xff1a;213. 打家劫舍 II Leetcode题目地址 题目描述&#xff1a; 你是一个专业的小偷&#xff0c;计划偷窃沿街的房屋&#xff0c;每间房内都藏有一定的现金。这个地方所有的房屋都 围成一…

电力系统短期负荷预测(Python代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

莲花-第10届蓝桥杯Scratch选拔赛真题精选

[导读]&#xff1a;超平老师计划推出Scratch蓝桥杯真题解析100讲&#xff0c;这是超平老师解读Scratch蓝桥真题系列的第99讲。 蓝桥杯选拔赛每一届都要举行4~5次&#xff0c;和省赛、国赛相比&#xff0c;题目要简单不少&#xff0c;再加上篇幅有限&#xff0c;因此我精挑细选…

16. 模型选择,欠拟合和过拟合 代码实现

我们现在可以通过多项式拟合来探索这些概念。 import math import numpy as np import torch from torch import nn from d2l import torch as d2l1. 生成数据集 max_degree 20 # 多项式的最大阶数&#xff0c;20个特征 n_train, n_test 100, 100 # 训练和测试数据集大小…

Kafka概念以及参数

概念&#xff1a; Concept: 主题&#xff1a;Topic。主题是承载消息的逻辑容器&#xff0c;在实际使用中多用来区分具体的业务。 Subject: Topic. A topic is a logical container that carries messages. In practice, it is often used to distinguish specific services.…

[附源码]计算机毕业设计的高校车辆租赁管理系统Springboot程序

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

在软件定义网络中使用机器学习的方法进行 DDOS 攻击检测与缓解--实验

在软件定义网络中使用机器学习的方法进行 DDOS 攻击检测与缓解--实验〇、拉取代码一、 配置环境二、 正常流量收集三、攻击流量数据四、DDoS攻击检测与缓解4.1 正常流量的检测4.2 攻击流量的检测与缓解五&#xff0c;精准度和检测率申明&#xff1a; 未经许可&#xff0c;禁止以…

Existence theorem

In mathematics, an existence theorem is a theorem which asserts the existence of a certain object.[1] It might be a statement which begins with the phrase “there exist(s)”, or it might be a universal statement whose last quantifier is existential (e.g., …

ADI Blackfin DSP处理器-BF533的开发详解22:SD卡的设计和实现原理及应用(含源码)

硬件准备 ADSP-EDU-BF533&#xff1a;BF533开发板 AD-HP530ICE&#xff1a;ADI DSP仿真器 软件准备 Visual DSP软件 硬件链接 功能介绍 ADSP-EDU-BF53x 板卡上设计了一个 SD/MMC 接口&#xff0c;可以通过该接口实现对 SD/MMC 卡数据的访问。 SD 卡有两种工作模式&#x…

C#使用 Async 和 Await 的异步编程

总目录 文章目录总目录前言一、概述二、命名规范三、await/async的作用四、基本使用五、使用Async和Await实现多任务顺序执行且不阻塞1.同步执行2.并行执行3.并行且可指定顺序执行总结前言 C# 中的 Async 和 Await 关键字是异步编程的核心。 通过这两个关键字&#xff0c;可以…

spring依赖查找、依赖注入深入学习及源码分析

文章目录一、依赖查找1、单一类型依赖查找&#xff08;接口 - BeanFactory&#xff09;根据Bean名称查找根据Bean类型实时查找根据Bean类型延迟查找&#xff08;Spring 5.1&#xff09;根据Bean名称类型查找2、集合类型依赖查找&#xff08;接口 - ListableBeanFactory&#xf…

Metal每日分享,颜色转换滤镜效果

本案例的目的是理解如何用Metal实现像素颜色转换滤镜&#xff0c;通过对像素颜色的不同读取方式获取到相应像素颜色&#xff0c;灰度图移除场景中除了黑白灰以外所有的颜色&#xff0c;让整个图像灰度化&#xff1b; Demo HarbethDemo地址 实操代码 // 转成灰度图滤镜 let f…

js深拷贝浅拷贝与lodash

title: js深拷贝浅拷贝与lodash date: 2022/9/27 14:46:25 categories: lodashjs入门 深拷贝和浅拷贝 ref&#xff1a;JS传递参数时的内部存储逻辑 JS 變數傳遞探討&#xff1a;pass by value 、 pass by reference 還是 pass by sharing&#xff1f; 在这个问题前&#xff…

LeetCode HOT 100 —— 169.多数元素

题目 给定一个大小为 n 的数组 nums &#xff0c;返回其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。 你可以假设数组是非空的&#xff0c;并且给定的数组总是存在多数元素。 思路 方法一&#xff1a;哈希表 遍历整个数组&#xff0c;记录每个数值出…

JAVA IO详解

目录 一、流的概念与作用 二、Java IO的用途和特征 三、流的使用详解 一、流的概念与作用 流(Stream)&#xff1a; 在Java IO中&#xff0c;流是一个核心的概念。流从概念上来说是一个连续的数据传输过程。人们根据数据传输特性将流抽象为各种类&#xff0c;方便更直观的进…

【服务器数据恢复】服务器raid5崩溃导致上层应用不可用的数据恢复案例

服务器数据故障&#xff1a; 某公司服务器8块硬盘组成raid5磁盘阵列&#xff0c;其中有2块硬盘故障指示灯报警&#xff0c;其他硬盘指示灯正常&#xff0c;上层应用不可用。 服务器数据恢复过程&#xff1a; 1、服务器数据恢复工程师拿到故障服务器所有硬盘后对出现物理故障的…

ADI Blackfin DSP处理器-BF533的开发详解18:用触摸屏的例程来理解中断(含源码)

硬件准备 ADSP-EDU-BF533&#xff1a;BF533开发板 AD-HP530ICE&#xff1a;ADI DSP仿真器 软件准备 Visual DSP软件 硬件链接 硬件实现原理 ADSP-EDU-BF533 开发板上的中断资源连接到了 CPLD&#xff0c;并通过 CPLD 将中断信号连接到 PF0 触发&#xff0c;通过 CPLD映射的…