字典和列表的删除问题, 深浅拷贝
一. 基础数据类型
1. str. join()
str. join(元组、列表、字典、字符串)可以把这些都转变成字符串.
a = 'hello'.join('123') b = '123'.join('hello') print(a) #1hello2hello3 print(b) #h123e123l123l123o li = ['hello','world','code'] str1 = '*'.join(li) print(str1) #hello*world*code tu = ('welcome','you','are') str2 = '@'.join(tu) print(str2) #welcome@you@are dic = {'name':'王力宏','job':'singer','age':'42'} str3 = '_'.join(dic) print(str3) #name_job_age
2. list删除
列表循环时不能不可以进行删除操作.因为删除一个元素后,剩下的索引会发生改变.一开始这个指针指向第0 个. 然后获取到第0个元素. 紧接着删除第0个. 这个时候. 原来是第一个的元素会自动的变成第0个. 然后指针向后移动一次, 指向1元素. 这时原来的1已经变成了0, 也就不会被删除了.
li = ['hello','world','code'] for c in li:li.remove(c) print(li) #['world']
li = ['hello','world','code'] for c in li:li.pop() print(li) #['hello']
li = ['hello','world','code'] for c in range(len(li)):del li[c] print(li) #报错
用pop可以删除:
li = ['hello','world','code'] for n in range(0,len(li)):li.pop() print(li) #[]
所以想要删除列表中的元素,要另建一个新列表来存储原列表的内容.对新列表进行循环,来删除原列表的元素.
li = ['hello','world','code'] li1 = [] for c in li:li1.append(c) for el in li1:li.remove(el) print(li) #[]
3. 字典增加删除
字典不能再循环的时候更改大小,所以循环的时候字典不可以增加删除.
dic1 = {"a":"123", "b":"456"} for k in dic1:dic1.setdefault("c", "123") print(dic1) #报错 RuntimeError: dictionary changed size during iteration dic2 = {"a":"321", "b":"654"} for k in dic2:dic2.pop(k) print(dic2) #报错 #RuntimeError: dictionary changed size during iteration
对字典循环删除,要先建一个新列表来存储字典的key值,再对列表循环,然后删除字典元素.
dic1 = {"a":"123", "b":"456"} li = [] for k in dic1:li.append(k) for el in li:dic1.pop(el) print(dic1) #{}
dict中的fromkey(),可以帮我们通过list来创建一个dict
dic = dict.fromkeys("王健林", "思聪" ) # 返回给你一个新字典 print(dic) #{'王': '思聪', '健': '思聪', '林': '思聪'}
4. 类型转换
元组 => 列表 list(tuple)
列表 => 元组 tuple(list)
list => str str.join(list)
str => list str.split()
三. 深浅拷贝
将一个列表赋值给lst1, 再将lst1赋值给lst2, lst1和late2的内存地址一样,共同指向同一个列表. 对lst2进行增加操作,lst1也会改变
lst1 = ["金毛狮王", "紫衫龙王", "白眉鹰王", "青翼蝠王"] lst2 = lst1 # 列表, 进行赋值操作. 实际上是引用内存地址的赋值. 内存中此时只有一个列表. 两个变量指向一个列表 lst2.append("杨左使") # 对其中的一个进行操作. 两个都跟着变 print(lst2) #['金毛狮王', '紫衫龙王', '白眉鹰王', '青翼蝠王', '杨左使'] print(lst1) #['金毛狮王', '紫衫龙王', '白眉鹰王', '青翼蝠王', '杨左使']
字典也是一样
dic1 = {1:"金毛狮王", 2:"紫衫龙王",3: "白眉鹰王", 4:"青翼蝠王"} dic2 = dic1 # 两个变量的内存一样,指向同一个列表. dic2.setdefault(5,"杨左使") # 对其中的一个进行操作. 两个都跟着变 print(dic2) #{1: '金毛狮王', 2: '紫衫龙王', 3: '白眉鹰王', 4: '青翼蝠王', 5: '杨左使'} print(dic1) #{1: '金毛狮王', 2: '紫衫龙王', 3: '白眉鹰王', 4: '青翼蝠王', 5: '杨左使'}
对于list, set, dict来说, 直接赋值. 其实是把内存地址交给变量. 并不是复制一份内容. 所以. lst1(dic1)的内存指向和lst2(dic2)是一样的. lst1(dic1)改变了了, lst2(dic2)也发生了改变.
1. 浅拷贝
浅拷贝, 只会拷贝第一层. 第二层的内容不会拷贝. 所以被称为浅拷贝.用copy()来进行拷贝.
lst1 = ["赵本山", "刘能", "赵四"] lst2 = lst1.copy() # lst2 和lst1 不是一个对象了 # lst2 = lst1[:] # 也可以用切片,切片会产生新的对象 lst1.append("谢大脚") print(lst1, lst2) #['赵本山', '刘能', '赵四', '谢大脚'] ['赵本山', '刘能', '赵四']
2.深拷贝
浅拷贝只能拷贝第一层,遇到有第二层的列表,无法对第二层进行拷贝.对拷贝后的变量lst1第二层更改,lst1也会改变.
lst1 = ["超人", "七龙珠", "葫芦娃", "山中小猎人", ["金城武", "王力宏", "渣渣辉"]] lst2 = lst1.copy() # 拷贝. 浅拷贝 拷贝第一层 lst1[4].append("大阳哥") #对第二次的列表进行增加操作 print(lst1, lst2) # ['超人', '七龙珠', '葫芦娃', '山中小猎人', ['金城武', '王力宏', '渣渣辉', '大阳哥']] # ['超人', '七龙珠', '葫芦娃', '山中小猎人', ['金城武', '王力宏', '渣渣辉', '大阳哥']]
深度拷贝. 把元素内部的元素完全进行拷贝复制. 不会产生一个改变另一个跟着改变的问题.
语法 import copy
copy.deepcopy()
import copy lst1 = ["超人", "七龙珠", "葫芦娃", "山中小猎人", ["金城武", "王力宏", "渣渣辉"]] lst2 = copy.deepcopy(lst1) # 把lst1扔进去进行深度拷贝 , 包括内部的所有内容进行拷贝 lst1[4].append("大阳哥") print(lst1, lst2) # ['超人', '七龙珠', '葫芦娃', '山中小猎人', ['金城武', '王力宏', '渣渣辉', '大阳哥']] # ['超人', '七龙珠', '葫芦娃', '山中小猎人', ['金城武', '王力宏', '渣渣辉']]
转载于:https://www.cnblogs.com/huangqihui/p/9289930.html
字典和列表的删除问题, 深浅拷贝相关推荐
- join,列表和字典用for循环的删除,集合,深浅拷贝
1.join() 将列表转换成字符串,并且每个字符之间用另一个字符连接起来,join后面必须是可迭代的对象(字符串,列表,元组,字典,集合),数字不能迭代 例如: 1 s = ['a','b','c' ...
- 列表的join方法,类方法formkeys,删除,集合,深浅拷贝赋值,冒泡排序
#列表join方法 lst = ["汪峰", "吴君如", "李嘉欣", "陈慧琳", "关之琳"] ...
- set集合, 深浅拷贝, join, 列表和字典在循环中删除元素的问题, fromkeys( , )
一. set集合 空集合 a = set() set集合内的元素必须可哈希(不可变), int, str, bool, tuple set3 = {'1','alex',2,True,(1,2,[2, ...
- 列表、字典补充点、strJoin方法、set()集合、和深浅拷贝
一 .对之前知识点的补充 str中的join方法,把列表换成字符串 1 s = "_".join("ABC") #可迭代对象 2 print(s) 3 > ...
- Learn day3 深浅拷贝/格式化/字符串/列表/字典/集合/文件操作
1. pass break continue # ### pass break continue # (1) pass 过 """如果代码块当中,什么也不写,用pass来 ...
- day02 格式化输出 运算符 编码 字符串 列表 元组 字典 set集合 深浅拷贝
day02学习大纲 一. 格式化输出: %s 占位字符串 %d 占位数字 "xxx%sx %sxx" % (变量, 变量) 二. 运算符: a+=b a = a + b and 并 ...
- python基础知识5——赋值与深浅拷贝——整数和字符串,列表元组字典
深浅copy 和很多语言一样,Python中也分为简单赋值.浅拷贝.深拷贝这几种"拷贝"方式. 在学习过程中,一开始对浅拷贝理解很模糊.不过经过一系列的实验后,我发现对这三者的概念 ...
- Python笔记_07_列表的相关操作_列表相关函数_深浅拷贝_字典相关函数_集合相关函数_冰冻集合
笔记目录 列表的相关操作 列表的拼接(同元组) 列表的重复 (同元组) 列表的切片 (同元组) 列表的获取 (同元组) 列表的修改 (可切片) 列表的删除 ( 可切片 ) 列表的相关函数 append ...
- day2-元组 列表-赋值和深浅拷贝
一 元组 元组其实跟列表差不多,也是存一组数,只不是它一旦创建,便不能再修改,所以又叫只读列表 用途:一般情况下用于自己写的程序能存下数据,但是又希望这些数据不会被改变,比如:数据库连接信息等 1. ...
最新文章
- “一百万行Python代码对任何人都足够了”
- git for c#, clone方法
- 同软件多个线程设置不同ip_中学校园广播-中学IP网络广播系统解决方案
- docker中部署hadoop、zookeeper、hbase伪分布式并上传到阿里云远程仓库
- 诗歌rials 之RJS的tips
- 解决The total number of locks exceeds the lock table size错误
- select默认下拉箭头改变、option样式清除
- 多路开关模式的switch语句
- PHPCMS修改目录
- igzo屏幕优点与缺点_手机贴膜怎么选?选对了可以省个屏幕钱
- window下默认的汉字模式——GBK
- Python压缩图片到指定大小
- GAN 模式崩溃的理论解释
- [HTML]北京邮电大学信息与通信工程学院选课参考指南
- Markdown文章排版
- python语句中print(type(1j))_Python语句 print(type(1/2))的输出结果是:______
- 魂动罗java源码_魂斗罗源码(VC版)
- 解决 remote: Repository not found. fatal: repository 'https://github.com/xxxx/xxxx.git/
- python 中的“_,“有什么用途
- 笔耕不辍,学习习惯?兴趣爱好?源于对真知的热爱?