1. is 和 == 的区别:
- is:判断两个变量的地址是否相同
- ==:判断两个变量的值是否相同
# a.不可变的数据类型:int/float/bool/str/tuple
n1 = 10
n2 = 10
# 比较值
print(n1 == n2) # True
# 比较地址
print(n1 is n2) # True
print(id(n1) == id(n2)) # True
n2 = 20
# 比较值
print(n1 == n2) # False
# 比较地址
print(n1 is n2) # False
print(id(n1) == id(n2)) # False
print("*" * 50)
# b.可变的数据类型:list/dict/set
list1 = [10,20,30]
list2 = [10,20,30]
# 比较值
print(list1 == list2) # True
# 比较地址
print(list1 is list2) # False
print(id(list1) == id(list2)) # False
list2 = [10,60,30]
# 比较值
print(list1 == list2) # False
# 比较地址
print(list1 is list2) # False
print(id(list1) == id(list2)) # False
- 结论:
两个变量的地址相同,则这两个变量的值一定相同;
两个变量的值相同,则这两个变量的地址不一定相同。
2. 列表拷贝
2.1 =引用赋值
list1 = [11,22,33]
list2 = list1
print(list1 is list2) # True
list1[1] = 100
print(list1 is list2) # True
print(list1) # [11, 100, 33]
print(list2) # [11, 100, 33]
list1 = [[11,22,33],[44,55]]
list2 = list1
print(list1 is list2) # True
list1[0][1] = 100
print(list1 is list2) # True
print(list1) # [[11,100,33],[44,55]]
print(list2) # [[11,100,33],[44,55]]
- 结论:
无论是一维列表还是多维列表,如果使用引用赋值的方式操作,只要通过一个变量修改了列表中的元素,则另一个变量访问的列表也会随着修改。
2.2 列表.copy():浅拷贝
list1 = [11,22,33]
list2 = list1.copy()
print(list1 is list2) # False
list1[1] = 100
print(list1 is list2) # False
print(list1) # [11,100,33]
print(list2) # [11,22,33]
list1 = [[11,22,33],[44,55]]
list2 = list1.copy()
print(list1 is list2) # False
list1[0][1] = 100
print(list1 is list2) # False
print(list1) # [[11,100,33],[44,55]]
print(list2) # [[11,100,33],[44,55]]
2.3 copy.copy():浅拷贝
list1 = [11,22,33]
list2 = copy.copy(list1)
print(list1 is list2) # False
list1[1] = 100
print(list1 is list2) # False
print(list1) # [11,100,33]
print(list2) # [11,22,33]
list1 = [[11,22,33],[44,55]]
list2 = copy.copy(list1)
print(list1 is list2) # False
list1[0][1] = 100
print(list1 is list2) # False
print(list1) # [[11,100,33],[44,55]]`在这里插入代码片`
print(list2) # [[11,100,33],[44,55]]
- 结论:列表.copy() 和 copy.copy(列表) 和 切片:
一维列表:如果一个变量修改列表中的元素,对另一个列表没有任何影响;
二维列表:如果一个变量修改内层列表中的元素,则另一个列表中的元素会随着发生修改。
2.4 copy.deepcopy():深拷贝
list1 = [11,22,33]
list2 = copy.deepcopy(list1)
print(list1 is list2) # False
list1[1] = 100
print(list1 is list2) # False
print(list1) # [11,100,33]
print(list2) # [11,22,33]
list1 = [[11,22,33],[44,55]]
list2 = copy.deepcopy(list1)
print(list1 is list2) # False
list1[0][1] = 100
print(list1 is list2) # False
print(list1) # [[11,100,33],[44,55]]
print(list2) # [[11,22,33],[44,55]]
- 结论:copy.deepcopy()
无论是一维列表还是多维列表,如果使用copy.deepcopy()的方式操作,通过一个变量修改了列表中的元素,另一个变量访问的列表没有影响。
注意:不管是浅拷贝还是深拷贝,都会生成一个新的列表,所以列表的地址都会发生改变。