知识点
- 比较操作符'=='表示比较对象间的值是否相等,而'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)...]