找回密码
 请使用中文注册

手机号码,快捷登录

手机号码,快捷登录

Python|列表运用常见陷阱及如何避免

2023-5-5 18:26| 发布者: 开心| 查看: 15| 评论: 0

阅读字号:

摘要:   Python中的列表不是由若干个独立的节点相互引用而成的,而是一整块单一连续的内存区块(相似于我们通常称之为数组(array)的储存结构)。这直接导致了它与链表之间 ...
      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列表运用常见陷阱及如何避免你学会了吗?

搜索
复制  收藏

路过

雷人

握手

鲜花

鸡蛋

最新评论

QQ|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.

返回顶部