python深浅拷贝,集合以及数据类型的补充
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了python深浅拷贝,集合以及数据类型的补充,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3877字,纯文字阅读大概需要6分钟。
内容图文
1.基础数据类型的补充
1.元组
如果元组中只有一个数据,且没有逗号,则该‘元组’与里面的数据的类型相同。如:
1 tu = (1) 2 tu1 = (1,) 3 tu2 = (‘alex‘) 4 tu3 = ([1,2,3],) 5print(tu,type(tu)) # 1 <class ‘int‘>6print(tu1,type(tu1)) # (1,) <class ‘tuple‘>7print(tu2,type(tu2)) # alex <class ‘str‘>8print(tu3,type(tu3)) # ([1, 2, 3],) <class ‘tuple‘>
2. 列表
列表与列表是可以相加的,如:
1 l1 = [1,2,3] 2 l2 = [‘alex‘,‘wusir‘] 3 l3 = l1 + l2 # [1, 2, 3, ‘alex‘, ‘wusir‘]4print(l3)
如何将列表中的索引为奇数的元素删除,如例题: l1 = [11, 22, 33, 44, 55, 66, 77, 88]
1 l1 = [11, 22, 33, 44, 55, 66, 77, 88] 2for i in range(len(l1)): 3if i % 2 == 1: 4 l1.pop(i) 5print(l1) # IndexError: pop index out of range
上面的代码看似正确,但执行后却报错,报错解释为:
IndexError: pop index out of range
经过分析后可知,每当pop()一次后,将奇数位删除,此时,删除位之后的元素会向前移动一位,导致l1的索引会不断的发生变化。因此,本文提出了三种解决方法:
第一种:切片 + 步长删除
1 l1 = [11, 22, 33, 44, 55, 66, 77, 88] 2del l1[1::2] 3print(l1)
第二种方法:
1 l1 = [11, 22, 33, 44, 55, 66, 77, 88] 2 l2 = [] # 重新创建一个空列表3for i in range(len(l1)): 4if i % 2 == 0: 5 l2.append(l1[i]) 6 l1 = l2 # 用l2去覆盖l17print(l1)
第三种方法:按照倒序删除:
1 for index in range(len(l1)-1, -1, -1): 2if index % 2 == 1: 3 l1.pop(index) 4print(l1)
综上分析:在循环一个列表时,最好不要对此列表直接进行改变大小(增删)操作。
3. 字典
字典的创建方式(三种:面试常考)
1 # 1, 2 dic = {‘name‘:‘alex‘} 3#24 dic = dict({‘name‘:‘alex‘}) 5print(dic) 6#3, fromkeys()7 dic1 = dict.fromkeys([1,2,3],‘alex‘) 8print(dic1)
但是,在第三种创建方式下,有别于第一种和第二种方式:
1 dic1 = dict.fromkeys([1,2,3],[]) 2print(dic1) # {1: [], 2: [], 3: []}3 dic1[1].append(‘alex‘) 4print(dic1) # {1: [‘alex‘], 2: [‘alex‘], 3: [‘alex‘]}5print(id(dic1[1])) # 14782415247446print(id(dic1[2])) # 14782415247447print(id(dic1[3])) # 1478241524744
如何将字典的键中含有k元素的所有键值对删除。如例题:dic = {‘key1‘: ‘value1‘,‘key2‘: ‘value2‘, ‘k3‘:‘v3‘, ‘name‘: ‘alex‘}
如果按照下面这种方式去处理会得到如下结果:
1 dic = {‘key1‘: ‘value1‘,‘key2‘: ‘value2‘, ‘k3‘:‘v3‘, ‘name‘: ‘alex‘} 2for key in dic: 3if‘k‘in key: 4 dic.pop(key) 5print(dic)
运行代码时,会发生报错,报错解释为:dictionary changed size during iteration。
其分析结果与列表分析一样,这是由于在循环一个字典时,不能改变字典的大小。因此解决方案是可以创建一个新的列表,先用来存储需要删除的键,然后通过遍历这个列表,去删除原字典中对应有的键。解题如下:
1 dic = {‘key1‘: ‘value1‘,‘key2‘: ‘value2‘, ‘k3‘:‘v3‘, ‘name‘: ‘alex‘} 2 l1 = [] 3for key in dic: 4if‘k‘in key: 5 l1.append(key) 6# print(l1)7for key in l1: 8 dic.pop(key) 9print(dic)
2.集合
集合是无序的,不重复的数据集合,它里面的元素是可哈希的(不可变类型),但是集合本身是不可哈希(所以集合做不了字典的键)的。
集合元素的数据类型通常为:元组,整数,字符串,bool值等。
集合的创建方式,有两种:
1 set1 = {‘alex‘, [1,2], 1,2,3} 2 set1 = {‘alex‘, ‘wusir‘} 3 set2 = set({‘alex‘, ‘wusir‘}) 4print(set2)
如何用list去重操作(面试题常考):
1 l1 = [1,1,2,3,4,4,3,2,1,5,5] 2 set1 = set(l1) 3 l2 = list(set1) 4print(l2)
不可变数据类型:
1 set1 = {1,2,3} 2 set3 = frozenset(set1) 3print(set3) # 不可变的数据类型。 ***
3 深浅拷贝
1 浅拷贝
什么是浅拷贝???我们先来看一个例题:
1 # 列表只有一层,无嵌套情况 2 l1 = [1,2,3] 3 l2 = l1 4 l1.append(666) 5print(l2) 6print(id(l1)) # 23096631043927print(id(l2)) # 2309663104392
1 # 有内层嵌套的列表 2 l1 = [1,2,3,[22,]] 3 l2 = l1.copy() 4 l1[-1].append(‘taibai‘) 5print(l1,l2) # [1, 2, 3, [22, ‘taibai‘]] [1, 2, 3, [22, ‘taibai‘]]6print(id(l1)) # 17872847579607print(id(l2)) # 17872855767128print(id(l1[-1])) # 17872847578969print(id(l2[-1])) # 1787284757896
从上面的分析可以看出,对于浅copy来说,第一层创建的是新的内存地址,而从第二层开始,指向的都是同一个内存地址,所以,对于第二层以及更深的层数来说,保持一致性。
2.深拷贝
同样,先举一个例子来看看什么是深拷贝:
1 import copy 2 l1 = [1,2,3,[22,]] 3 l2 = copy.deepcopy(l1) 4 l1[-1].append(‘太白‘) 5print(l1,l2) # [1, 2, 3, [22, ‘太白‘]] [1, 2, 3, [22]]6print(id(l1)) # 17638107593047print(id(l2)) # 17638107605848print(id(l1[-1])) # 17638107591129print(id(l2[-1])) # 1763810760520
从上面的分析我们可以知道:对于深copy来说,两个是完全独立的,改变任意一个的任何元素(无论多少层),另一个绝对不改变。
深浅拷贝应用的场景:面试常考,让你解释深浅拷贝。
# 完全独立的copy一份数据,与原数据没有关系,深copy
# 如果一份数据(列表)第二层时,你想与原数据进行公用,浅copy。
另外:切片也属于浅拷贝,例如:
1 l1 = [1,2,3,[22,33]] 2 l2 = l1[:] 3 l1[-1].append(666) 4print(l1,l2) # [1, 2, 3, [22, 33, 666]] [1, 2, 3, [22, 33, 666]]5print(id(l1)) # 12348663474006print(id(l2)) # 12348671662167print(id(l1[-1])) # 12348663474648print(id(l2[-1])) # 1234866347464
原文:https://www.cnblogs.com/colin1314/p/9457912.html
内容总结
以上是互联网集市为您收集整理的python深浅拷贝,集合以及数据类型的补充全部内容,希望文章能够帮你解决python深浅拷贝,集合以及数据类型的补充所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。