知识点

  • 比较操作符'=='表示比较对象间的值是否相等,而'is'表示比较对象的标识是否相等,即它们是否指向同一个内存地址。
  • 比较操作符'is'效率优于'==',因为'is'操作符无法被重载,执行'is'操作只是简单的获取对象的 ID,并进行比较;而'=='操作符则会递归地遍历对象的所有值,并逐一比较。
  • 浅拷贝中的元素,是原对象中子对象的引用,因此,如果原对象中的元素是可变的,改变其也会影响拷贝后的对象,存在一定的副作用。
  • 深度拷贝则会递归地拷贝原对象中的每一个子对象,因此拷贝后的对象和原对象互不相关。另外,深度拷贝中会维护一个字典,记录已经拷贝的对象及其 ID,来提高效率并防止无限递归的发生。

代码块

#!/usr/bin/env python
# coding: utf-8

# In[2]:


l1 = [1, 2, 3]
l2 = list(l1)
print(l2)


# In[6]:


a = 10
b = 10

print(a == b)

print(id(a))

print(id(b))

print(a is b)

# 以上a is b为 True 的结论,只适用于 -5 到 256 范围内的数字


# In[10]:


l1 = [1, 2 ,3]
l2 = list(l1)

print(l2)

print(l1 == l2)

print(l1 is l2)


# In[12]:


l1 = [1, 2, 3]
l2 = l1[:]

print(l1 == l2)

print(l1 is l2)


# In[15]:


import copy
l1 = [1, 2, 3]
l2 = copy.copy(l1)
print(l2)


# In[17]:


t1 = (1, 2, 3)
t2 = tuple(t1)

print(t2 == t1)

print(t2 is t1)

# 使用 tuple() 或者切片操作符':'不会创建一份浅拷贝
# 相反,它会返回一个指向相同元组的引用


# In[19]:



l1 = [[1, 2], (30, 40)]
l2 = list(l1)
l1.append(100)
l1[0].append(3)

print(l1)


print(l2)

l1[1] += (50, 60)
print(l1)


print(l2)


截图

![图片上传中(0)...]

![图片上传中(0)...]

![图片上传中(0)...]

Jupyter NoteBook File

Python对象的比较、拷贝.ipynb

最后修改:2019 年 11 月 18 日
如果觉得我的文章对你有用,请随意赞赏