一、概述

列表(list)是由一个个 Python对象 组成的序列。其中,Python对象 可以是任何类型的对象,包括 Python标准类型(数值、字符串、列表、元组和字典)以及 用户自定义类型(类)。相比而言,字符串 仅仅是字符的序列,因此列表的概念和用途比字符串更广泛。

元组(tuple)也是 Python对象 的序列,与列表非常接近。二者的主要差异点如下:

差异点 列表 元组
表示方法

空列表:[]

单元素列表:[1]

多元素列表[1, 'a']

空元组:()

单元素元组:(1,)

多元素元组:(1, 'a')

可变性 可变 不可变
可操作性 支持丰富的操作 仅支持序列操作
可哈希性 不可哈希,不能作为字典的关键字 可哈希,可以作为字典的关键字

其中,可变性 是列表和元组之间最本质的差异:列表是一个可变序列,而元组是一个不可变序列。用C/C++的话来讲,元组是一个const版本的列表

二、操作

由于列表和元组都是序列类型,因此它们都支持 Python基础:序列 中给出的 通用序列操作

特别地,作为一个可变序列,列表还支持以下 列表操作

操作 说明
s[i] = x 用x替换s中的第i个成员
del s[i] 从s中删除第i个成员
s[i:j] = t 用t替换s[i:j]
del s[i:j] 从s中删除s[i:j](等价于s[i:j] = [])
s[i:j:k] = t 用t替换s[i:j:k](len(t)必须等于len(s[i:j:k]))
del s[i:j:k] 从s中删除s[i:j:k]
s.append(x) 向s中添加一个成员x(等价于s[len(s):len(s)] = [x])
s.count(x) 返回x在s中出现的次数(即满足s[i]==x的下标i的个数)
s.extend(x) 将迭代对象x中的成员扩充到s的末尾(等价于s[len(s):len(s)] = x)
s.index(x[, i[, j]]) 返回x在s[i:j]中的最小下标,不存在则抛出ValueError异常
s.insert(i, x) 等价于s[i:i] = [x]
s.pop([i]) 返回并删除s中的第i(默认为-1)个成员(等价于x = s[i]; del s[i]; return x)
s.remove(x) 等价于del s[s.index(x)]
s.reverse() 将s中的成员反序排列
s.sort([cmp[, key[, reverse]]]) 对s进行排序

以上操作的示例如下:

>>> s = [1, 2, 3, 4, 5, 6]
>>> s[0] = 8
>>> s
[8, 2, 3, 4, 5, 6]
>>> del s[1]
>>> s
[8, 3, 4, 5, 6]
>>> s[2:4] = [7, 9, 10]
>>> s
[8, 3, 7, 9, 10, 6]
>>> del s[1:3]
>>> s
[8, 9, 10, 6]
>>> s[::-2] = [7, 4]
>>> s
[8, 4, 10, 7]
>>> del s[2::-1]
>>> s
[7]
>>> s.append(2)
>>> s
[7, 2]
>>> s.extend([5, 4, 3, 4, 2, 2, 1])
>>> s
[7, 2, 5, 4, 3, 4, 2, 2, 1]
>>> s.count(2), s.count(4)
(3, 2)
>>> s.index(2), s.index(4)
(1, 3)
>>> s.insert(1, [8, 9])
>>> s
[7, [8, 9], 2, 5, 4, 3, 4, 2, 2, 1]
>>> s.pop()
1
>>> s
[7, [8, 9], 2, 5, 4, 3, 4, 2, 2]
>>> s.pop(5)
3
>>> s
[7, [8, 9], 2, 5, 4, 4, 2, 2]
>>> s.remove(2)
>>> s
[7, [8, 9], 5, 4, 4, 2, 2]
>>> s.reverse()
>>> s
[2, 2, 4, 4, 5, [8, 9], 7]
>>> s.sort()
>>> s
[2, 2, 4, 4, 5, 7, [8, 9]]

三、列表特性

1、列表解析

列表解析 是列表特有的构建操作:结合列表的方括弧和for循环(还可以使用if进行过滤),在逻辑上描述要创建的列表的成员内容。

简单示例如下:

>>> [i * 2 for i in [8, -2, 5]]
[16, -4, 10]
>>> [i for i in range(8) if i % 2 == 0]
[0, 2, 4, 6]

2、数据结构

列表非常灵活,它是一个 操作丰富可变序列。因此,使用列表可以很方便地实现一些经典的数据结构:如堆栈、队列等(具体可以参考 用Python实现的数据结构与算法:开篇)。

四、元组特性

1、可变与不可变

元组本身是不可变的,这意味着:如果元组为t,则可以通过t[i]来得到第i个成员的值,但无法通过t[i]去修改第i个成员的值。

元组包含的成员是否可变,与元组的不可变无关,只取决于成员本身的可变性。例如元组t的第i个成员是一个列表l,则可以通过t[i][j]去修改列表l的第j个成员的值。

>>> t = ('a', [1, 2], (7, 8))
>>> t[0] = 'b' # 元组t本身不可变
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'tuple' object does not support item assignment
>>> t[1][1] = 5 # 成员t[1]是列表,可变
>>> t
('a', [1, 5], (7, 8))
>>> t[2][1] = 10 # 成员t[2]是元组,不可变
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'tuple' object does not support item assignment

2、默认集合类型

所有逗号分隔的、没有明确用符号包括的 多对象集合 的类型都默认为元组。

# 一般表达式
>>> 'abc', -4.24e93, 18+6.6j
('abc', -4.24e+93, (18+6.6j))
>>> x, y = 1, 2
>>> x, y
(1, 2) # 函数返回值
>>> def func():
... return 1, 2, 3
...
>>> func()
(1, 2, 3)

特别地,函数的 位置参数 也是通过元组来实现的(具体参考 Python函数的带星号*参数)。

五、浅拷贝和深拷贝

在Python的世界里,对所有对象的操作都是通过 引用(本质上就是C中的 指针)来完成的。由此不难得知,在列表和元组中存储的 真正成员,不是成员对象本身,而是成员对象的引用。

对列表和元组进行拷贝时,默认进行的是 浅拷贝:只拷贝成员对象的引用,而不会拷贝引用指向的成员对象本身。借助于 copy模块 的deepcopy方法,可以实现 深拷贝:既拷贝成员对象的引用,又会拷贝引用指向的成员对象本身。

值得注意的是,上述说法并不完全正确:如果成员对象本身是原子类型的(数值、字符串,或者只包含数值或字符串的元组),那么对该成员不会发生真正的深拷贝,即便执行深拷贝动作,内部也只会进行浅拷贝。

浅拷贝和深拷贝的示意图如下:

关于浅拷贝和深拷贝的实际案例,可以参考 《Python核心编程(第二版)》 中的 『6.20』 一节:『*拷贝Python对象、浅拷贝和深拷贝』。

Python基础:序列(列表、元组)的更多相关文章

  1. python基础(五)列表,元组,集合

    列表 在python中是由数个有序的元素组成的数据结构,每一个元素对应一个index索引来隐式标注元素在列表中的位置.是python中最常用的一种数据类型.需要注意的是列表中可以有重复相同的数据. 列 ...

  2. Python基础数据类型-列表(list)和元组(tuple)和集合(set)

    Python基础数据类型-列表(list)和元组(tuple)和集合(set) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 本篇博客使用的是Python3.6版本,以及以后分享的 ...

  3. python基础之列表list元组tuple

    作者:tongqingliu 转载请注明出处:http://www.cnblogs.com/liutongqing/p/7041763.html python基础之列表list元组tuple 列表li ...

  4. 孤荷凌寒自学python第八天 初识Python的序列之元组

    孤荷凌寒自学python第八天 Python的序列之元组 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) (同步音频笔记:https://www.ximalaya.com/keji/19103 ...

  5. python基础数据类型--列表(list)

    python基础数据类型--列表(list) 列表是我们在后面经常用到的数据类型之一,通过列表可以对数据类型进行增.删.改.查等操作 一列表的增.删.改.查 1增: 1.1增加到最后   append ...

  6. Python基础学习 -- 列表与元组

    本节学习目的: 掌握数据结构中的列表和元组 应用场景: 编程 = 算法 + 数据结构 数据结构: 通过某种方式(例如对元素进行编号)组织在一起的数据元素的集合,这些元素可以是数字或者字符,或者其他数据 ...

  7. python基础4 列表和元组

    一. 列表列表:python基础数据类型之一:其他语言中也有列表的概念,js 数组,可索引,可切片,可加步长li = ['hello', 100, True, [1, 2, 3], {'name':' ...

  8. python笔记(1)--序列(列表 元组 range)

    一.序列分类 1.可变序列:list 2.不可变序列:tuple,range 二.序列公共操作方法 1.操作和返回值 其中s和t代表同类型序列:n,i,j,k为整数:x为任意类型. 序号 操作 结果 ...

  9. Python入门基础学习(列表/元组/字典/集合)

    Python基础学习笔记(二) 列表list---[ ](打了激素的数组,可以放入混合类型) list1 = [1,2,'请多指教',0.5] 公共的功能: len(list1) #/获取元素 lis ...

  10. Day2 - Python基础2 列表、字典、集合

    Python之路,Day2 - Python基础2   本节内容 列表.元组操作 字符串操作 字典操作 集合操作 文件操作 字符编码与转码 1. 列表.元组操作 列表是我们最以后最常用的数据类型之一, ...

随机推荐

  1. Sublime Text 使用技巧

    之前就一直在用Sublime Text 来作为默认的文本编辑工具,但也只是简单的用用,一些Sublime Text本身的快捷键什么的都没研究过,今天特地在网上看了一下,快捷键比较多,要想熟练运用还得在 ...

  2. 深入剖析 redis RDB 持久化策略

    简介 redis 持久化 RDB.AOF redis 提供两种持久化方式:RDB 和 AOF.redis 允许两者结合,也允许两者同时关闭. RDB 可以定时备份内存中的数据集.服务器启动的时候,可以 ...

  3. The model backing the <Database> context has changed since the database was created.

    Just found out the answer and thought of updating here. Just need to do the following. public class ...

  4. iOS杂谈-图片拉伸的实现

    如上图是一个按钮的背景图,在Android上,很多图片资源都是类似这样子的,但是由于按钮的高度及宽度与图片的世纪尺寸不同,所以需要采用9patch来实现拉伸处理, 可参考:http://www.cnb ...

  5. Android源码网站

    https://mirrors.tuna.tsinghua.edu.cn/ https://mirrors.tuna.tsinghua.edu.cn/help/AOSP/ https://mirror ...

  6. [LeetCode] Best Meeting Point

    Problem Description: A group of two or more people wants to meet and minimize the total travel dista ...

  7. JAVA笔记 之 JDK新特性

    JDK1.5新特性1.泛型(Generics) 为集合(collections)提供编译时类型安全,无需每刻从Collections取得一个对象就进行强制转换(cast) 2.增强的for循环(for ...

  8. C/C++/Qt 统计运行时间

    http://www.cnblogs.com/Romi/archive/2012/04/19/2457175.html 程序中经常需要统计时间,需要统计某项运算的运行时间时,需要计算时间差. 1. C ...

  9. VS2010 项目引用了微软企业库,但是编译时提示:未能找到类型或命名空间名称

    我写的是控制台程序 是在引用我自己写的库 和 Microsoft.Practices.EnterpriseLibrary 时出现的问题 经过分析,和百度 找到了修改方法 打开  项目属性-->应 ...

  10. MemSQL start[c]up Round 2 - online version C. More Reclamation(博弈)

    题目大意 额,写来写去,我还是直接说抽象之后的题目大意吧: 有一个 r*2 的矩形,两个人轮流的在矩形上面减去一个 1*1 的小正方形,要求在减的过程中,不能使矩形“断开”,也就是说,如果一个人减去了 ...