深浅拷⻉ :
lst1 = ["⾦⽑狮王", "紫衫⻰王", "⽩眉鹰王", "⻘翼蝠王"] lst2 = lst1 print(lst1) print(lst2) lst1.append("杨逍") print(lst1) print(lst2) 结果: ['⾦⽑狮王', '紫衫⻰王', '⽩眉鹰王', '⻘翼蝠王', '杨逍'] ['⾦⽑狮王', '紫衫⻰王', '⽩眉鹰王', '⻘翼蝠王', '杨逍']
dic1 = {"id": 123, "name": "谢逊"}
dic2 = dic1
print(dic1)
print(dic2)
dic1['name'] = "范瑶"
print(dic1)
print(dic2)
结果:
{'id': 123, 'name': '谢逊'}
{'id': 123, 'name': '谢逊'}
{'id': 123, 'name': '范瑶'}
{'id': 123, 'name': '范瑶'}
对于list, set, dict来说, 直接赋值. 其实是把内存地址交给变量. 并不是复制⼀份内容. 所以.
lst1的内存指向和lst2是⼀样的. lst1改变了, lst2也发⽣了改变
1. 浅拷贝 copy()
lst1 = ["何炅", "杜海涛","周渝⺠"] lst2 = lst1.copy() lst1.append("李嘉诚") print(lst1) print(lst2) print(id(lst1), id(lst2)) 结果: 两个lst完全不⼀样. 内存地址和内容也不⼀样. 发现实现了内存的拷⻉
lst1 = ["何炅", "杜海涛","周渝⺠", ["麻花藤", "⻢芸", "周笔畅"]]
lst2 = lst1.copy()
lst1[3].append("⽆敌是多磨寂寞")
print(lst1)
print(lst2)
print(id(lst1[3]), id(lst2[3]))
结果:
['何炅', '杜海涛', '周渝⺠', ['麻花藤', '⻢芸', '周笔畅', '⽆敌是多磨寂寞']]
['何炅', '杜海涛', '周渝⺠', ['麻花藤', '⻢芸', '周笔畅', '⽆敌是多磨寂寞']]
4417248328 4417248328
深拷贝
1. 开头 引用模块 import copy
deepcopy()
import copy
import copylst1 = ["何炅", "杜海涛","周渝⺠", ["麻花藤", "⻢芸", "周笔畅"]] lst2 = copy.deepcopy(lst1) lst1[3].append("⽆敌是多磨寂寞") print(lst1) print(lst2) print(id(lst1[3]), id(lst2[3])) 结果: ['何炅', '杜海涛', '周渝⺠', ['麻花藤', '⻢芸', '周笔畅', '⽆敌是多磨寂寞']] ['何炅', '杜海涛', '周渝⺠', ['麻花藤', '⻢芸', '周笔畅']] 4447221448 4447233800
都不⼀样了. 深度拷⻉. 把元素内部的元素完全进⾏拷⻉复制. 不会产⽣⼀个改变另⼀个跟着
改变的问题
str操作
1. join() 把列表变成字符串
2. split() 把字符串转换成列表
# lst = ["黄飞鸿", "霍元甲", "十三姨", "鬼脚七"] # s = "_*_".join(lst) # 把列表变成字符串. 用前面的字符串把列表连接起来, 返回新字符串 # print(s) # s = "金毛狮王" # s1 = "_".join(s) # 迭代把每一项进行拼接 # print(s1) # 金毛狮王 # tu = ('你好', "你不好", "你好不好") # s = "".join(tu) # print(s) s = "你今天准备什么时候睡觉" s1 = "_".join(s) # 你_今_天_... lst = s1.split("_") print(lst)
for循环的问题.
# index = 1 # while index < 11: # index = index + 1 # if index == 5: # break # print(index) # else: # print("哈哈哈") # print("呵呵") # 234呵呵 # for 从1 到10 for i in range(1, 11): print(i) if i == 3: break # 也可以使用break和continue else: # for循环后面也有else print("蒙哥, 看啥呢???") print("那里没有代码")
list的删除问题(绕)
1. 列表在循环的时候如果执行了删除操作. 索引和长度会有变化. 这种删除是不安全.
2. 先把要删除的内容放在一个新列表中. 然后循环这个新列表. 删除老列表.
1. 列表在循环的时候如果执行了删除操作. 索引和长度会有变化. 这种删除是不安全.
2. 先把要删除的内容放在一个新列表中. 然后循环这个新列表. 删除老列表.
3. dict在循环过程中是不允许删除的.
4.把要删除的键放在列表中. 循环列表删除字典
4.把要删除的键放在列表中. 循环列表删除字典
li = [11, 22, 33, 44] for e in li: li.remove(e) print(li) 结果: [22, 44]
分析原因:
for的运⾏过程. 会有⼀个指针来记录当前循环的元素是哪⼀个, ⼀开始这个指针指向第0
个. 然后获取到第0个元素. 紧接着删除第0个. 这个时候. 原来是第⼀个的元素会⾃动的变成
第0个. 然后指针向后移动⼀次, 指向1元素. 这时原来的1已经变成了0, 也就不会被删除了
⽤pop删除试试看:
li = [11, 22, 33, 44] for i in range(0, len(li)): del li[i] print(li)
结果: 报错
# i= 0, 1, 2 删除的时候li[0] 被删除之后. 后⾯⼀个就变成了第0个.
# 以此类推. 当i = 2的时候. list中只有⼀个元素. 但是这个时候删除的是第2个 肯定报错啊
经过分析发现. 循环删除都不⾏. 不论是⽤del还是⽤remove. 都不能实现. 那么pop呢?
for el in li:
li.pop() # pop也不⾏
print(li)
结果:
[11, 22]
只有这样才是可以的:
for i in range(0, len(li)): # 循环len(li)次, 然后从后往前删除
li.pop()
print(li)