Python的==与is、深拷贝与浅拷贝、copy与deepcopy

==与is

  • ==用来比较两个对象是否相等(相等不是相同),即比较内容
  • is用来比较两个引用是否指向了同一对象,即比较引用
  • 下面举一个例子:
a = [1,2,3]
b = [1,2,3]
c = a
print(a == b)#输出True
print(a is b)#输出为False
print(a is c)#输出为True
print(a == c)#输出为True

深拷贝与浅拷贝

  • 浅拷贝是地址的拷贝,而深拷贝是内容的拷贝。
  • 浅拷贝是用等号的方式进行变量间赋值,而深拷贝则需要用到copy模块。
  • 下面分别展示浅拷贝和深拷贝:
import copy
a = [1,2,3]
b = a#浅拷贝
c = copy.deepcopy(a)#深拷贝
  • 常见的函数传参都是浅拷贝

copy与deepcopy

  • copy模块下有两个函数都有拷贝的功能(copy()和deepcopy()),两者都是深拷贝(即对内容进行拷贝)。
  • 但相对于copy(),deepcopy()是更深的拷贝。
  • copy()只负责最上层内容的拷贝,而deepcopy()是将所要拷贝内容里面的引用所指向的内容也进行拷贝。下面举例进行说明:
import copy
a = [1,2,3]
b = [4,5,6]
c = [a,b]#c中存放的是a和b列表存放的地址
e = copy.deepcopy(c)#e中存放的是a和b列表被拷贝后新列表存放的地址,e与c不是指向同一片内存
f = copy.copy(c)#f中存放的是a和b列表存放的地址,f与c也不是指向同一片内存
#所以当a的内容被修改后,f[0]也发生了相应的变化,但e[0]不会受到影响
g = c#g与c指向同一片内存
  • 需要注意一点的是:copy()方法并不是一直是深拷贝,它会对要拷贝的对象进行判断,如果是可变类型如列表,那么就是深拷贝,正如上面所讲;如果是不可变类型如元组,那么就是浅拷贝,相当于等于号的变量间赋值。下面列出代码进一步解释:
h = (a,b)
i = copy.copy(h)#i与h指向同一片内存

猜你喜欢

转载自blog.csdn.net/gaishi_hero/article/details/81838624