python列表和元组的区别

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python列表和元组的区别相关的知识,希望对你有一定的参考价值。

List list是一种处理一组有序项目的数据结构,也就是说,您可以在一个列表中存储一系列项目。 元组是Scala语言中非常有用的容器对象。元组非常类似于列表,但是元组是不可变的。列表控件可以在四种不同的视图中显示项目,而元组适用于许多场景。List list是一种处理有序项目集的数据结构,也就是说,您可以在一个列表中存储一系列项目。列表中的项目应该用方括号括起来,这样python就知道您在指示一个列表。创建列表后,您可以添加、删除或搜索列表中的项目。由于可以添加或删除项目,所以我们说列表是可变数据类型,也就是说,这种类型是可以改变的。列表可以嵌套。元组非常类似于列表,但是元组是不可变的。也就是不能修改元组。元组由括号中逗号分隔的项定义。元组通常用于使语句或用户定义的函数能够安全地采用一组值,也就是说,所使用的元组的值不会改变。元组可以嵌套。列表控件可以在四种不同的视图中显示项目。您可以将项目分组到有或没有列标题的列中,并显示附带的图标和文本。例如,ListView控件用于将名为ListItem对象的列表项组织成以下四种不同视图之一:1 .大(标准)图标2。小图标3。清单4。“报表视图”属性确定控件使用哪个视图来显示列表中的项。比如组件[1]的列表控件,有完整的列表框、多栏下拉列表框、拆分样式等。它可以管理列表中项目的排序方法和选定项目的外观。Tuple是Scala语言中非常有用的容器对象。像列表一样,元组是不可变的;但是与列表不同,元组可以包含不同类型的元素。比如一个list只能写成List[Int]或者List[String],但是一个tuple可以同时有Int和String。元组适用于许多场景,例如,如果您需要在一个方法中返回多个对象。Java中的做法是创建一个已经包含多个返回值的JavaBean,Scala只能返回元组。而且做起来也很简单;把元组实例化需要的对象放在括号里,用逗号隔开就行了。元组实例化后,可以通过点、下划线和基于1的索引来访问其中的元素。 参考技术A

首先我们需要了解的是,元组和列表属于序列,都是按照特定顺序储存的一组元素,可以将证书、实数、字符串、列表、元组、字典、集合等任何类型的内容,创建和删除的方法也是一样的。

二者的区别主要有以下几点:

1、列表是动态的,属于可变序列,元素可以增加、修改、删除,而元组是静态的,属于不可变序列,无法增加、删除、修改元素,除非整体替换。

2、列表可以使用append()、extend()、insert()、remove()和pop()等方法实现添加和修改列表元素,而元组没有这几个方法,因为不能向元组中添加和修改元素,同样,也不能删除元素,可以整体替换。

3、列表可以使用切片访问和修改列表中的元素,元组也支持切片,但它只支持通过切片访问元组中的元素,不支持修改。

4、元组比列表的访问和处理速度快,所以如果只需要对其中的元素进行访问,而不进行任何修改,建议使用元组而不使用列表。

5、因为列表可以修改,元组不可以修改,因此元组比列表具有更高的安全性。

6、列表不能作为字典的键,而元组可以。

7、存储方式不同:空列表比空元组多占用16个字节。

参考技术B 1、元组是不可变的, 而列表是可变的。
2、元组通常有不同的数据类型,而列表是相同类型的数据队列。元组表示的是结构,而列表表示的是顺序。
3、不能将列表当作字典的key, 而元组可以
4、由于元组支持的操作比列表小, 所以元组会比列表稍稍快上那么一点。但是如果不是海量数据处理,这点差异基本可以忽略

Python列表和元组的使用方法及区别 详解

本文主要介绍了python列表和元组的区别,通过示例代码的详细介绍,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考!

列表(list)和元组(tuple)的一些基础

list和tuple都是一个可以放置任意数据类型的有序集合,都是既可以存放数字、字符串、对象等


list和tuple都支持负索引

In [8]: nums[-2]
Out[8]: 'ad'
In [9]: tp[-2]
Out[9]: '33'

list和tuple都支持切片操作

In [10]: nums[1:3]
Out[10]: [3, 'ad']
In [11]: tp[1:3]
Out[11]: (3, '33')

list和tuple都可以随意嵌套

In [12]: nums = [[1,2,3],['s','ff'],['34',3,5]]
In [13]: tp = ((23,4,'f'),45,'d',('dd',4,'ff'))

list和tuple的一些区别

列表是动态的,长度大小不固定,可以随意的增加、删除、修改元素元组是静态的,长度在初始化的时候就已经确定不能更改,更无法增加、删除、修改元素


从图中看出我们对list做出修改是成功的,但是对tuple修改的时候,确抛出了错误,那如果想对tuple做出改变该如何做呢?只能重新开辟一块内存,重新生成新到的tuple了。


从tuple的源码中也可以看出,只有两个自带的方法,一个是统计元素出现的次数一个是查询元素的索引。

list和tuple存储方式的差异

我们先来看个例子

In [19]: nums=['a',1,2]
In [20]: tp=('a',1,2)
In [21]: nums.__sizeof__()
Out[21]: 64
In [22]: tp.__sizeof__()
Out[22]: 48

这里构造了一个list和一个tuple。他们存储的内容是相同的,__sizeof__方法可以打印系统分配空间的大小。可以看到他们所占用的内存空间是不同的,存储的内容相同,但是list比tuple多占用了16自己的内存。

先来看一下一个数组的内存分配过程:

In [23]: l=[]
 
In [24]: l.__sizeof__() // 空列表分配了40字节的内存
Out[24]: 40
 
In [25]: l.append('a') // 增加了一个一个元素后,给列表分配了72字节的内存,一个字符8个字节
                                                // 那就是一次性分配了4个字符的内存空间
 
In [26]: l.__sizeof__()
Out[26]: 72
 
In [27]: l.append('b') // 再增加字符,占用内存不变
 
In [28]: l.__sizeof__()
Out[28]: 72
 
In [29]: l.append('c') // 再增加字符,占用内存不变
 
In [30]: l.__sizeof__()
Out[30]: 72
 
In [31]: l.append('d') // 再增加字符,占用内存不变
 
In [32]: l.__sizeof__()
Out[32]: 72
 
In [33]: l.append('e') // 再添加元素,内存不够,触发重新的内存分配
 
In [34]: l.__sizeof__()
Out[34]: 104

可以看出list为了能够实时追踪内存的使用情况,当空间不足时以及分配额外空间,额外的多分配了内存,而且还需要存储指针,指向对应的元素。

我们可以看到,为了减小每次增加 / 删减操作时空间分配的开销,Python 每次分配空间时都会额外多分配一些,这样的机制(over-allocating)保证了其操作的高效性:增加 / 删除的时间复杂度均为 O(1)。但是对于元组,情况就不同了。元组长度大小固定,元素不可变,所以存储空间固定。

所以说在存储大量的数据的时候,这种差异是需要考虑的,如果数据发生变更的可能性不大,就用元组存储,如果数据是需要频繁的进行数据的修改增加,就使用列表

一、列表与元组的区别

列表:

1.可以增加列表内容 append

2.可以统计某个列表段在整个列表中出现的次数 count

3.可以插入一个字符串,并把整个字符串的每个字母拆分当作一个列表段追加到列表当中 extedn

4.可以查询某个列表段在整个列表的位置 index

5.可以在指定位置插入一个列表段 insert

6.可以删除列表的最后一个列表段 pop

7.可以删除指定列表中的某个列表段 remove

8.可以正向反向排序 reverse

9.可以按字母或数字排序 sort

10.定义列表时候使用中括号"[]"

注意:在列表当中,假如某两个列表段相同,不管是使用index还是remove都是统计的最靠前的列表段。

元组:

1.可以统计某个元组段在整个元组中出现的次数 count

2.可以查询某个元组段在整个元组中的元组号 index

3.定义元组时候使用小括号"()"

二、列表与元组的使用方法

列表

#定义列表
>>> name_list = ['sean','tom','jack','Angelia','Daisy','jack'] 
#查看定义的列表
>>> name_list
['sean', 'tom', 'jack', 'Angelia', 'Daisy', 'jack']
#增加david列表段
>>> name_list.append('david')
>>> name_list
['sean', 'tom', 'jack', 'Angelia', 'Daisy', 'jack', 'david']
#统计david列表段出现次数
>>> name_list.count('david')
1
>>> name_list.count('jack')
2
#使用extend向列表中增加列表段
>>> name_list.extend('Hello,My name is sean')
>>> name_list
['sean', 'tom', 'jack', 'Angelia', 'Daisy', 'jack', 'david', 'H', 'e', 'l', 'l', 'o', ',', 'M', 'y', ' ', 'n', 'a', 'm', 'e', ' ', 'i', 's', ' ', 's', 'e', 'a', 'n']
#查看列表段所在的索引号,注意这里统计的jack为第一个jack id号
>>> name_list.index('jack')
2
>>> name_list.index('tom')
1
#向索引号为2的地方插入Adam
>>> name_list.insert(2,'Adam')
>>> name_list
['sean', 'tom', 'Adam', 'jack', 'Angelia', 'Daisy', 'jack', 'david', 'H', 'e', 'l', 'l', 'o', ',', 'M', 'y', ' ', 'n', 'a', 'm', 'e', ' ', 'i', 's', ' ', 's', 'e', 'a', 'n']
#删除最后一个列表段
>>> name_list.pop()
'n'
>>> name_list
['sean', 'tom', 'Adam', 'jack', 'Angelia', 'Daisy', 'jack', 'david', 'H', 'e', 'l', 'l', 'o', ',', 'M', 'y', ' ', 'n', 'a', 'm', 'e', ' ', 'i', 's', ' ', 's', 'e', 'a']
#删除指定列表段,注意这里删除的是第一个jack
>>> name_list.remove('jack')
>>> name_list
['sean', 'tom', 'Adam', 'Angelia', 'Daisy', 'jack', 'david', 'H', 'e', 'l', 'l', 'o', ',', 'M', 'y', ' ', 'n', 'a', 'm', 'e', ' ', 'i', 's', ' ', 's', 'e', 'a']
#对整个列表进行倒序
>>> name_list.reverse()
>>> name_list
['a', 'e', 's', ' ', 's', 'i', ' ', 'e', 'm', 'a', 'n', ' ', 'y', 'M', ',', 'o', 'l', 'l', 'e', 'H', 'david', 'jack', 'Daisy', 'Angelia', 'Adam', 'tom', 'sean']
#对整个列表进行倒序
>>> name_list.reverse()
>>> name_list
['sean', 'tom', 'Adam', 'Angelia', 'Daisy', 'jack', 'david', 'H', 'e', 'l', 'l', 'o', ',', 'M', 'y', ' ', 'n', 'a', 'm', 'e', ' ', 'i', 's', ' ', 's', 'e', 'a']
#对整个列表进行列表段的首字母进行排序
>>> name_list.sort()
>>> name_list
[' ', ' ', ' ', ',', 'Adam', 'Angelia', 'Daisy', 'H', 'M', 'a', 'a', 'david', 'e', 'e', 'e', 'i', 'jack', 'l', 'l', 'm', 'n', 'o', 's', 's', 'sean', 'tom', 'y']
>>>

元组

#定义元组name_tuple
>>> name_tuple = ('xiaoming','xiaohong','xiaoli','xiaozhang','xiaoming')
>>> name_tuple
('xiaoming', 'xiaohong', 'xiaoli', 'xiaozhang', 'xiaoming')
#统计xiaoming、xiaohong在元组内出现的次数
>>> name_tuple.count('xiaoming')
2
>>> name_tuple.count('xiaohong')
1
#查询xiaoming、xiaohong、xiaozhang在元组内的id号
>>> name_tuple.index('xiaoming')
0
>>> name_tuple.index('xiaohong')
1
>>> name_tuple.index('xiaozhang')
3
>>> 
#尝试增加一个元组单元
>>> name_tuple.append('xiaowang')
Traceback (most recent call last):
File "<pyshell#49>", line 1, in <module>
name_tuple.append('xiaowang')
AttributeError: 'tuple' object has no attribute 'append'
>>>

元组的元素是不可变的,元组的元素的元素是可变的

>>> tuple_A = (1,2,'k1':'v1')
>>> for i in tuple_A:
... print i
... 
1
2
'k1': 'v1'
#更改元素
>>> tuple_A[2]['k1'] = 'v2'
>>> for i in tuple_A:
... print i
... 
1
2
'k1': 'v2'
>>>

如果你喜欢今天的Python教程,请三连,如果对你有帮助,可扫下方领取Python全套学习资料

以上是关于python列表和元组的区别的主要内容,如果未能解决你的问题,请参考以下文章

Python列表和元组的使用方法及区别 详解

Python列表和元组的使用方法及区别 详解

Python列表和元组的使用方法及区别 详解

Python基础(3) - 去掉列表或元组中的重复元素

深入理解python列表和元组

编程里面元组和数组的区别是啥?