栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

学习笔记3-python深拷贝、浅拷贝及赋值补充(主要面试问题)

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

学习笔记3-python深拷贝、浅拷贝及赋值补充(主要面试问题)

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 =引用赋值
  • a.一维列表
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]
  • b.二维列表
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():浅拷贝
  • 浅拷贝:只拷贝列表的最外层(值)
  • a.一维列表
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]
  • b.二维列表
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():浅拷贝
  • a.一维列表
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]
  • b.二维列表
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():深拷贝
  • a.一维列表
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]
  • b.二维列表
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()的方式操作,通过一个变量修改了列表中的元素,另一个变量访问的列表没有影响。
注意:不管是浅拷贝还是深拷贝,都会生成一个新的列表,所以列表的地址都会发生改变。
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/951477.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号