Python中的列表不是由若干个独立的节点相互引用而成的,而是一整块单一连续的内存区块(相似于我们通常称之为数组(array)的储存结构)。这直接导致了它与链表之间的一些重要分别(访问很快,中间插入较慢)。今天,小编向大家介绍一下Python列表运用常见陷阱及如何避免。 C++的STL的list容器是一个双向链表(doubly-linked lists,数据元素处于不是连续的、没有关系的内存区域,面通过指针链接起来),可高效地进行插入删除元素。 Python的list提供随机访问(下标+偏移值操作),STL的list不提供随机访问,需要遍历操作。 1 列表对象与相同值(Python列表运用常见陷阱) 变量是对对象的引用,当值相同时,列表会创建两个对象,元组也一样,而字符串却只创建一个对象 t1 = [1,2,3] t2 = [1,2,3] print(id(t1)) print(id(t2)) print(id(t1[2])) print(id(t2[2]),'\n') output: 36450872 20379848 1429201712 1429201712 元组在这一方面与列表一样: tp1 = (1,2,3) tp2 = (1,2,3) print(id(tp1)) print(id(tp2)) output: 19722888 36551816 字符串对于相同的值,会指向同一个对象: s1 = 'abcde' s2 = 'abcde' print(id('abcde')) print(id(s1)) print(id(s2),'\n') output: 36525376 36525376 36525376 2 列表与别名(Python列表运用常见陷阱) 当两个变量相互赋值时,左值是右值的别名,对于可变对象而言,修改了任何其一,另一个也会如此,因为它们有相同的指向。 t1 = [4,5,6] t2 = [4,5,6] t3 = t2 # 修改前的内存指向见下图 t2[1] = 77 t3[2] = 88 # 修改后的内存指向见下图 print(t1) print(t2) print(t3) output: [4, 5, 6] [4, 77, 88] [4, 77, 88] # 修改前的内存指向 Python列表运用常见陷阱图1 # 修改后的内存指向 Python列表运用常见陷阱图2 避免别名陷阱的方式是尽量不运用别名,而是通过复制列表来达到目的 如: t = [3,2,1] t2 = t[:] t2.sort() 3 列表作为函数参数(Python列表运用常见陷阱) 列表作为可变对象在作为函数参数时,可以修改列表,当切片操作时例外. 1.1 修改操作时,函数内外的相同指向的变量会一同修改 def modilist(t): ....t[2] = 44 ....t.append(99) ....t += [111] ....print(t) t = [4,5,6] modilist(t) print(t) output: [4, 5, 44, 99,111] [4, 5, 44, 99,111] 1.2 切片操作创建新列表时,原始列表并不改变 def striplist(t): ....t = t[1:len(t)-1] ....print(t) t = [4,5,6,7,8] striplist(t) print(t) output: [5, 6, 7] [4, 5, 6, 7, 8] 4 避免列表对象运用修改方式后的赋值操作(Python列表运用常见陷阱) 大部分列表方式都是修改参数并返回None的。这与字符串、元组等不可变对象的方式不一样,不可变对象的方式通常都会返回一个相同类型的不可变对象。 t = [3,2,8,5,4] t = t.sort() # 一种无意义的写法 print(t) # output:None 有意义的写法应该是: t = [3,2,8,5,4] t.sort() print(t) # output:[2, 3, 4, 5, 8] 5 当有不一样的方式可以做同样的事情时,选择统一风格(Python列表运用常见陷阱) 如从列表中删除一个元素,可以选择pop、remove、del或者切片赋值; 如添加一个元素可以选择append或+操作符。 t = [3,2,8,5,4] t.append[11] t += [22] 以下写法是错误的,或没有意义: t.append([11]) t = t.append(x) t += 11 t + [11] 今天小编就讲解到这,Python列表运用常见陷阱及如何避免你学会了吗? 搜索 复制 收藏 |
|Archiver|手机版|家电维修论坛
( 蜀ICP备19011473号-4 川公网安备51102502000164号 )
GMT+8, 2025-6-19 11:22 , Processed in 0.114622 second(s), 18 queries .
Powered by Discuz! X3.5
© 2001-2025 Discuz! Team.