《 Python List 列表全实例详解系列(一)》__列表概念,创建列表(5种方式)

​活动地址:CSDN21天学习挑战赛

《 Python List 列表全实例详解系列(一)》

__列表概念,创建列表(5种方式)

系列总目录:

一、list列表概念
二、创建列表(5种方式)
 (2.1)、使用 [ ] 创建list列表
 (2.2)、使用 list() 函数创建列表
 (2.3)、由原有列表切片创建列表副本
 (2.4)、由列表推导式创建列表
 (2.5)、由copy 创建列表

三、访问列表元素(索引和切片)
 (3.1)、使用索引访问列表元素
 (3.2)、使用切片访问列表元素

四、列表反转的6种方法
 (4.1)、通过列表的切片操作实现列表反转
 (4.2)、使用列表对象的reverse()方法实现列表反转
 (4.3)、使用内置reversed()函数实现列表反转
 (4.4)、使用列表推导式实现列表反转
 (4.5)、使用sort() 实现列表反转
 (4.6)、使用sorted()实现列表反转

五、向list 列表添加元素(4种方法)
 (5.1)、append() 方法添加元素
 (5.2)、extend() 方法添加元素
 (5.3)、insert() 方法插入元素
 (5.4)、用运算符插入另一个列表的元素

六、list 列表删除元素(4种方法)
   (6.1)、del 根据索引值删除元素
   (6.2)、pop() 根据索引值删除元素
   (6.3)、remove() 根据元素值进行删除元素
   (6.4)、clear() 删除列表所有元素

七、删除列表中重复的元素的方法
 方法一:使用set()函数去重
 方法二:使用count()函数和remove()函数去重
 方法三:使用列表推导的方式去重

八、删除列表中的空值元素
 方法一:使用while循环的的方式
 方法二:抽取非空的列表元素,存储到新的列表中
 方法三:通过count()计算空值元素个数,再遍历列表删除

九、list 列表修改元素 
 (7.1)、修改单个元素
 (7.2)、修改一组元素 
 (7.3)、随机列表元素 
十、list 列表查找元素
 (8.1)、index()方法查找某元素在列表中出现的位置 
 (8.2)、count()方法统计某元素在列表中出现的次数 
十一、清空列表 
 (9.1)、用listname=[]方式清空列表
 (9.2)、用listname[:]=[]方式清空列表
 (9.3)、用del listname[:]方式清空列表
 (9.4)、用listname.clear()方式清空列表
 (9.5)、用listname *= 0方式清空列表
十二、Python列表运算符
十三、list列表相关技巧
 (11.1)python中list和str互相转换  
 (11.2)获取列表list里面元素的下标  
 (11.3)列表和元组有什么区别 
十四、list 列表内置及常用函数
十五、列表练习实例

本章目录

一、list列表概念

二、创建列表(5种方式)

(2.1)、使用 [ ] 创建list列表

(2.2)、使用 list() 函数创建列表

(2.3)、由原有列表切片创建列表副本

(2.4)、由列表推导式创建列表

(2.5)、由copy 创建列表


一、list列表概念

  在开发中,需要将一组数据存储起来,以便调用分析处理。在其他语言里,例如JAVA,会用到数组(Array)来处理这类数据,它可以把多个数据挨个存储到一起,通过数组下标可以访问数组中的每个元素。

  Python 中没有数组,但有列表list。Python中的list与Java中的数组有类似的地方——都是用[]包裹的。

  列表是元素按顺序排列构成的有序的集合,其中的每个元素都有各自的位置编号,方便索引操作。列表里面的元素可以是各种类型共存的,即列表list中的元素是任意类型的,可以是数字、字符串甚至还可以是列表、元组、字典等。

  列表中的元素是可以被修改的。

  所以,有一句话说:列表在Python中什么都可以干。

  经常用 list 代指列表,这是因为列表的数据类型就是 list,通过 type() 函数就可以知道。

代  码

#用内置函数type()查看变量str引用对象的类型,如果是<class 'list'>,它的数据类型为 list,就表示它是一个列表。

str=["萤火明晰双眼","辨分真与假",0,-1, [5,6,7], 6.139,'Adversity Awake']

print(type(str))

print(str)

运行结果

<class 'list'>

['萤火明晰双眼', '辨分真与假', 0, -1, [5, 6, 7], 6.139, 'Adversity Awake']

语  法

[element1, element2, element3, ..., elementn]

参  数

element1 ~ elementn 表示列表中的元素,个数没有限制,只要是 Python 支持的数据类型就可以。

列表可以存储整数、小数、字符串、列表、元组等任何类型的数据,并且同一个列表中元素的类型也可以不同。

注  意

1、列表中同时包含字符串、整数、列表、浮点数这些数据类型。

2、在使用列表时,虽然可以将不同类型的数据放入到同一个列表中,但通常情况下不这么做,同一列表中只放入同一类型的数据,这样可以提高程序的可读性。

3、列表会将所有元素都放在一对中括号[ ]里面,相邻元素之间用逗号,分隔,

4、一个列表中能够容纳多少东西?“有容乃大”是对列表最好的形容,它的大小仅受制于硬件设备和你的意愿。

知识扩展

二、创建列表(5种方式)

(2.1)、使用 [ ] 创建list列表

  可以用方括号直接创建元组,括号里的元素用逗号隔开。当[ ]内不存在任何元素时,便创建了一个空列表。一般使用=将它赋值给某个变量。

语  法

listname = [element1 , element2 , element3 , ... , elementn]

参  数

listname 表示变量名,

element1 ~ elementn 表示列表元素。

注  意

使用此方式创建列表时,列表中元素可以有多个,也可以一个都没有

返 回 值

返回列表

知识拓展

实 例

代  码

#用内置函数type()查看变量num引用对象的类型,如果是<class 'list'>,即为list,列表创建成功

num = [1,2,3,4,5,6,7,8]

print(type(num))

print(num)

运行结果

<class 'list'>

[1, 2, 3, 4, 5, 6, 7, 8]

代  码

web = ["www.csdn.net"]

print(type(web))

print(web)

运行结果

<class 'list'>

['www.csdn.net']

代  码

prolans = ["Python", "Java","C语言","OpenCV","PostgreSQL","CUDA","CS"]

prolans1 = ['Python','Java','C语言','OpenCV','PostgreSQL','CUDA','CS']

print(type(prolans))

print(prolans)

print(type(prolans1))

print(prolans1)

运行结果

<class 'list'>

['Python', 'Java', 'C语言', 'OpenCV', 'PostgreSQL', 'CUDA', 'CS']

<class 'list'>

['Python', 'Java', 'C语言', 'OpenCV', 'PostgreSQL', 'CUDA', 'CS']

代  码

#定义了一个空的列表,变量emptylist相当于一个贴在其上的标签

emptylist = [ ]

print(type(emptylist))

print(emptylist)

运行结果

<class 'list'>

[]

代  码

mlist =['6', 8, '逆境清醒','Adversity Awake','( ^@^)']

print(type(mlist))

print(mlist)

运行结果

<class 'list'>

['6', 8, '逆境清醒', 'Adversity Awake', '( ^@^)']

代  码

mlist =["萤火明晰双眼","辨分真与假",0,-1, [5,6,7], 6.139,'Adversity Awake']

print(type(mlist))

print(mlist)

运行结果

<class 'list'>

['萤火明晰双眼', '辨分真与假', 0, -1, [5, 6, 7], 6.139, 'Adversity Awake']

代  码

mlist = list("ad‘s\ni#[email protected] A\tk%e8\r9")

print(mlist)

运行结果

['a', 'd', '‘', 's', '\n', 'i', '#', 't', '@', 'y', ' ', 'A', '\t', 'k', '%', 'e', '8', '\r', '9']

(2.2)、使用 list() 函数创建列表

  Python 还提供了一个内置的函数 list(),使用它可以将其它数据类型转换为列表类型。

  list()函数实质是把目标对象转为列表的类型。同直接创建列表的方式很像,这里是在list()函数后面用圆括号将目标对象转为列表类型。

  可以在list的圆括号中放入建立列表需要的元素,这些元素放入时必须是一个元组对象或者是一个列表对象,不可以直接将元素列进list()函数中的括号里,也可以将某一变量放进去,list()函数会帮助我们自动将元素转为列表的形式。

  同样,如果没有传入任何元素,将创建一个空的列表。

语  法

list( tup )

参  数

tup -- 要转换为列表的元组

注  意

元组与列表是非常类似的,区别在于元组的元素值不能修改,元组是放在括号中,列表是放于方括号中。

返 回 值

返回列表

知识拓展

实 例

代  码

#将字符串转换成列表

mlist = list("Adversity Awake")

print(mlist)

运行结果

['A', 'd', 'v', 'e', 'r', 's', 'i', 't', 'y', ' ', 'A', 'w', 'a', 'k', 'e']

代  码

#将元组转换成列表

tuple1 = ("Python", "Java","C语言","OpenCV")

mlist = list(tuple1)

print(mlist)

运行结果

['Python', 'Java', 'C语言', 'OpenCV']

代  码

#将字典转换成列表

dict1 = {'红苹果':"红色", '香蕉':"黄色", '橘子':"橙色"}

mlist = list(dict1)

print(mlist)

运行结果

['香蕉', '红苹果', '橘子']

代  码

#将区间转换成列表

range1 = range(0, 8)

mlist = list(range1)

print(mlist)

运行结果

[0, 1, 2, 3, 4, 5, 6, 7]

代  码

#创建空列表

print(list())

运行结果

[]

代  码

list1=["萤火明晰双眼","辨分真与假",0,-1, [5,6,7], 6.139,'Adversity Awake']

mlist = list(list1)

print(mlist)

运行结果

['萤火明晰双眼', '辨分真与假', 0, -1, [5, 6, 7], 6.139, 'Adversity Awake']

代  码

num=1,2,3,4,5

mlist=list(num)

print(mlist)
运行结果 [1, 2, 3, 4, 5]

更多实例请访问:《 list()函数实例详解 》

(2.3)、由原有列表切片创建列表副本

语  法

#创建完整副本

Listname2 = Listname1 [ : ]

参  数

注  意

使用切片是浅列表复制

返 回 值

返回列表

知识拓展

实 例

代  码

mlist = list("Adversity Awake")

mlist5 = mlist[ : ]

print(type(mlist5))

print(mlist5)

运行结果

<class 'list'>

['A', 'd', 'v', 'e', 'r', 's', 'i', 't', 'y', ' ', 'A', 'w', 'a', 'k', 'e']

代  码

mlist = list(("苹果", "雪梨", "香蕉", "草莓", "菠萝", "桃子"))

mlist5 = mlist[ : ]

print(type(mlist5))

print(mlist5)

运行结果

<class 'list'>

['苹果', '雪梨', '香蕉', '草莓', '菠萝', '桃子']

代  码

mlist =[]

mlist5 = mlist[ : ]

print(type(mlist5))

print(mlist5)

运行结果

<class 'list'>

[]

代  码

#创建具有mlist前4个元素的mlist5

mlist = list(("苹果", "雪梨", "香蕉", "草莓", "菠萝", "桃子"))

mlist5 = mlist[0:4]

print(type(mlist5))

print(mlist5)

运行结果

<class 'list'>

['苹果', '雪梨', '香蕉', '草莓']

代  码

#创建具有mlist从第6个开始到第12-1个元素的mlist5

mlist = list("Adversity Awake")

mlist5 = mlist[6:12]

print(type(mlist5))

print(mlist5)

运行结果

<class 'list'>

['i', 't', 'y', ' ', 'A', 'w']

代  码

#创建具有mlist前2个元素的mlist5

mlist=["萤火明晰双眼","辨分真与假",0,-1, [5,6,7], 6.139,'Adversity Awake']

mlist5 = mlist[0:2]

print(type(mlist5))

print(mlist5)

运行结果

<class 'list'>

['萤火明晰双眼', '辨分真与假']

代  码

mlist= [1,2,3,4,5]

mlist2= list(mlist)

print(mlist2)

运行结果

[1, 2, 3, 4, 5]

(2.4)、由列表推导式创建列表

  list comprehension列表推导式,是一种创建列表的简洁语法;它是一个简版的for循环,但执行效率高于for循环。

  除了列表推导式,还有集合推导式、字典推导式,原理与列表推导式相近。

  语法规范:out_list = [out_express for out_express in input_list if out_express_condition]

  其中,if 条件可有可无;

  for 循环可以嵌套多层,内外层循环的变量不可以同名;

  推导式中也可以嵌套推导式,内外层推导式的变量互不影响,可以同名;

  推导表达式out_express尽可能用内置函数,省得 import 或 def function()。

实 例

代  码

mlist=[ i ** 2  for i in  range  (5)] 

print(mlist)

运行结果

[0, 1, 4, 9, 16]

代  码

mlist=[i+j for i in range(3) for j in range(5)]
print(mlist)

运行结果

[0, 1, 2, 3, 4, 1, 2, 3, 4, 5, 2, 3, 4, 5, 6]

代  码

mlist=[i for i in range(10) if i%2==0]
print(mlist)

运行结果

[0, 2, 4, 6, 8]

代  码

#让我们创建一个属于“mlist”列表的偶数列表:

mlist=[ i ** 2  for i in  range( 10 ) ]

mlistB =[ i for i in mlist if i%2==0 ]

print(mlist)

print(mlistB)

运行结果

[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

[0, 4, 16, 36, 64]

代  码

mlist= [i**2 for i in range(15)]

mlistB = [i for i in mlist if i%4==0]

print(mlist)

print(mlistB)

运行结果

[0, 1, 4, 9, 16, 25, 36, 49, 64, 81, 100, 121, 144, 169, 196]

[0, 4, 16, 36, 64, 100, 144, 196]

代  码

mlist= [0,2,4,6,8,'Adversity Awake', '逆境清醒']

mlistB= [mlist[len(mlist)-i-1] for i in range(len(mlist))]

print(mlistB)

运行结果

['逆境清醒', 'Adversity Awake', 8, 6, 4, 2, 0]

代  码

# 用列表推导式过滤出列表中的偶数:

# -*- coding: UTF-8 -*-

if __name__ == '__main__':

    mlist=[4,7,7,1,9,5,2,6,0,8]

    print("列表:",mlist)

    print("用列表推导式过滤出列表中的偶数:")

    filternum = [num for num in mlist if num % 2 == 0]

    print(filternum)

    print('')

运行结果

[4, 2, 6, 0, 8]

代  码

#用列表推导式过滤出列表中的奇数:
# -*- coding: UTF-8 -*-
if __name__ == '__main__':
    mlist=[4,7,7,1,9,5,2,6,0,8]
    print("列表:",mlist)
    print("用列表推导式过滤出列表中的奇数:")
    filternum = [num for num in mlist if num % 2 != 0]
    print(filternum)
    print('')

运行结果

[7, 7, 1, 9, 5]

代  码

# 用列表推导式过滤出晴天的日子

# -*- coding: UTF-8 -*-

if __name__ == '__main__':

    mlist = [

        {"key": "第一天", "值": "天晴朗,那花儿朵朵绽放","标签": ["晴天"]},

        {"key": "第二天", "值": "山青青,水蓝蓝", "标签": ["晴天"]},

        {"key": "第三天", "值": "看日出,看云海", "标签": ["晴天"]},

        {"key": "第四天", "值": "车窗外,雨好大", "标签": ["雨天"]},

        {"key": "第五天", "值": "荷叶下,躲着一只小青蛙","标签": ["雨天"]},

        {"key": "第六天", "值": "彩虹桥,路弯弯", "标签": ["晴天"]}

    ]

    print("过滤出晴天的日子")

    sundays = [day for day in mlist if '晴天' in day["标签"]]

    for days in sundays:

        print(" [{}]: {}".format(days['key'], days['值']))

    print('')

运行结果

[第一天]: 天晴朗,那花儿朵朵绽放

[第二天]: 山青青,水蓝蓝

[第三天]: 看日出,看云海

[第六天]: 彩虹桥,路弯弯

代  码

# 用列表推导式过滤出雨天的日子

# -*- coding: UTF-8 -*-

if __name__ == '__main__':

    mlist = [

        {"key": "第一天", "值": "天晴朗,那花儿朵朵绽放","标签": ["晴天"]},

        {"key": "第二天", "值": "山青青,水蓝蓝", "标签": ["晴天"]},

        {"key": "第三天", "值": "看日出,看云海", "标签": ["晴天"]},

        {"key": "第四天", "值": "车窗外,雨好大", "标签": ["雨天"]},

        {"key": "第五天", "值": "荷叶下,躲着一只小青蛙","标签": ["雨天"]},

        {"key": "第六天", "值": "彩虹桥,路弯弯", "标签": ["晴天"]}

    ]

    print("过滤出雨天的日子")

    raindays = [day for day in mlist if '雨天' in day["标签"]]

    for days in raindays:

        print(" [{}]: {}".format(days['key'], days['值']))

    print('')

运行结果

[第四天]: 车窗外,雨好大

[第五天]: 荷叶下,躲着一只小青蛙

代  码 mlist =[]                                   
for i in range(10):
  next = [None,None]
  next[0] = i
  next[1] = i
  mlist.append(next)
print(mlist)

运行结果

[[0, 0], [1, 1], [2, 2], [3, 3], [4, 4], [5, 5], [6, 6], [7, 7], [8, 8], [9, 9]]

代  码

#分别从两个列表中取出所有的元素,再放入新列表中
mlist3=[]
mlist1 =[1,2,3,4,5]   
mlist2 =[6,7,8,9,10]   
for i in mlist1:
    mlist3.append(i)
for i in mlist2:
    mlist3.append(i)
print(mlist3)

运行结果

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

2.5)、由copy 创建列表

  有时需要在保存原来的列表数据的同时对这个列表进行变更操作,此时会用到copy方法。copy方法能够创建一个完全一样的列表,虽然意思上是一样的列表,但只是元素一样,copy后的一个列表已经是一个新的列表。

如果在修改新列表时需要原始列表保持不变,则可以使用copy()方法。这称为浅拷贝。

语  法

new_list = list.copy()

copy1 = copy.copy(origin)

copy2 = deepcopy(origin)

参  数

没有任何参数。

注  意

" = " 即一般意义的复制,浅复制

列表切片等价于深复制

copy()函数返回一个列表。它不会修改原始列表。

知识拓展

copy1 = mlist

copy2 = mlist.copy()

copy3 = deepcopy(mlist)

copy1 mlist 的引用(别名),所以输出结果都是一致的,

copy2 父对象进行了深拷贝,不会随mlist 修改而修改,子对象是浅拷贝所以随 mlist 的修改而修改。

copy3 mlist 的深拷贝.

实 例

代  码

import copy

from copy import deepcopy

mlist= [3,8,[3,4],5,1,8,21,46,35]

copy1 = mlist

copy2 = mlist.copy()

copy3 = deepcopy(mlist)

print("mlist: ",mlist,id(mlist))

print("copy1: ",copy1,id(copy1))

print("copy2: ",copy2,id(copy2))

print("copy3: ",copy3,id(copy3))

print("mlist is copy1: ",mlist is copy1)

print("mlist is copy2: ",mlist is copy2)

print("mlist is copy3: ",mlist is copy3)

运行结果

mlist:  [3, 8, [3, 4], 5, 1, 8, 21, 46, 35] 12802968

copy1:  [3, 8, [3, 4], 5, 1, 8, 21, 46, 35] 12802968

copy2:  [3, 8, [3, 4], 5, 1, 8, 21, 46, 35] 12447576

copy3:  [3, 8, [3, 4], 5, 1, 8, 21, 46, 35] 12803728

mlist is copy1:  True

mlist is copy2:  False

mlist is copy3:  False

代  码

import copy

from copy import deepcopy

mlist= [3,8,[3,4],5,1,8,21,46,35]

copy1 = mlist

copy2 = mlist.copy()

copy3 = deepcopy(mlist)

print("mlist: ",mlist)

mlist[7:7] = [38624,42638]

print("mlist: ",mlist)

print("copy1: ",copy1)

print("copy2: ",copy2)

print("copy3: ",copy3)

#copy1 mlist 的引用(别名),所以输出结果都是一致的,随mlist 修改而修改

#copy2 父对象进行了深拷贝,不会随mlist 修改而修改

#copy3 mlist 的深拷贝,不会随mlist 修改而修改

运行结果

mlist:  [3, 8, [3, 4], 5, 1, 8, 21, 46, 35]

mlist:  [3, 8, [3, 4], 5, 1, 8, 21, 38624, 42638, 46, 35]

copy1:  [3, 8, [3, 4], 5, 1, 8, 21, 38624, 42638, 46, 35]

copy2:  [3, 8, [3, 4], 5, 1, 8, 21, 46, 35]

copy3:  [3, 8, [3, 4], 5, 1, 8, 21, 46, 35]

代  码

import copy

from copy import deepcopy

mlist= [3,8,[3,4],5,1,8,21,46,35]

copy1 = mlist

copy2 = mlist.copy()

copy3 = deepcopy(mlist)

print("mlist: ",mlist)

mlist[2][0] = "change!"

print("mlist: ",mlist)

print("copy1: ",copy1)

print("copy2: ",copy2)

print("copy3: ",copy3)

#copy1 mlist 的引用(别名),所以输出结果都是一致的,随mlist 修改而修改

#copy2 父对象进行了深拷贝,子对象是浅拷贝所以随 mlist 的修改而修改。

#copy3 mlist 的深拷贝,不会随mlist 修改而修改

运行结果

mlist:  [3, 8, [3, 4], 5, 1, 8, 21, 46, 35]

mlist:  [3, 8, ['change!', 4], 5, 1, 8, 21, 46, 35]

copy1:  [3, 8, ['change!', 4], 5, 1, 8, 21, 46, 35]

copy2:  [3, 8, ['change!', 4], 5, 1, 8, 21, 46, 35]

copy3:  [3, 8, [3, 4], 5, 1, 8, 21, 46, 35]

代  码

#-*- coding: UTF-8 -*-

import copy

mlist= ["人都应该有梦","有梦就别怕痛"]

copy1 =mlist

copy2 = mlist.copy()

print("原来的 mlist : ",mlist)

print("原来的 copy1 : ",copy1)

print("原来的 copy2 : ",copy2)

mlist.append('要相信')

mlist.append('这个世界美好总要多过阴暗')

print("现在的 mlist: ",mlist)

print("现在的 copy1: ",copy1)

print("现在的 copy2: ",copy2)

运行结果

原来的 mlist :  ['人都应该有梦', '有梦就别怕痛']

原来的 copy1 :  ['人都应该有梦', '有梦就别怕痛']

原来的 copy2 :  ['人都应该有梦', '有梦就别怕痛']

现在的 mlist:  ['人都应该有梦', '有梦就别怕痛', '要相信', '这个世界美好总要多过阴暗']

现在的 copy1:  ['人都应该有梦', '有梦就别怕痛', '要相信', '这个世界美好总要多过阴暗']

现在的 copy2:  ['人都应该有梦', '有梦就别怕痛']

代  码

运行结果

篇幅太长,请点击下一章查看后续实例详解 ------》

逆境清醒 Python List列表——全实例详解系列
1 《 Python List 列表全实例详解系列(一)》__列表概念,创建列表(5种方式)
2 《 Python List 列表全实例详解系列(二)》__访问列表元素(索引和切片)列表反转(6种方法)
3 《 Python List 列表全实例详解系列(三)》__列表添加元素(4种方法)
4 《  Python List列表全实例详解系列(四)》__列表删除元素(4种方法)删除重复元素方法
5 《 Python List 列表全实例详解(五)》__
6 《 Python List 列表全实例详解(六)》__
7 《 Python List 列表全实例详解(七)》__
8 《 Python List 列表全实例详解(八)》__
9 《 Python List 列表全实例详解(九)》__
10 《 Python List 列表全实例详解(十)》__

 推荐阅读:

14 ​​
13 用代码过中秋,python海龟月饼你要不要尝一口?
12 Python List 列表(创建、索引和切片、列表反转、添加删除修改查找元素)__实例详解(全)
11 用代码写出浪漫合集(python 绘制爱心、玫瑰花,字符画爱心、前端特效玫瑰、爱心)
10 Python函数方法实例详解全集(更新中...)
9 matplotlib 自带绘图样式效果展示速查(全)
8 手机屏幕坏了____怎么把里面的资料导出(18种方法)
7 2022年8月多家权威机构____编程语言排行榜__薪酬状况
6 Python中Print()函数的用法___详解(全,例多)
5 色彩颜色对照表系列(1~5)(16进制、RGB、CMYK、HSV、中英文名)
4 Tomcat端口配置(详细)
3 Tomcat 启动闪退问题解决集(八大类详细)
2 Apache Tomcat 各版本发行时间( v10.1.0-M17~v3.0)
1 Tomcat10安装(Windows环境)(详细)

猜你喜欢

转载自blog.csdn.net/weixin_69553582/article/details/126365799