python基础4-元组

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/EngineerHe/article/details/99416412

python基础4

在这里插入图片描述

数据类型

元组

tuple(元组)是python中一种不可修改的数据类型;它和列表很相似,最大的区别就是元组的元素不能修改。列表是使用中括号创建,元组是使用小括号(但是单独创建一个元素时,有坑,下文介绍),在括号内添加元素,然后使用逗号隔开,元组的特点可以总结如下:

  • 使用()创建
  • 一旦初始化,不可以修改
  • 元组是有序的
  • 安全,不可变
# 定义元组
>>> t1 = ('t', 'u', 'p', 'l', 'e')
>>> t2 = (1,2,3)
>>> t3 = ((1,2), [3,4], 'tuple', {"type":"tuple"})
# 通过tuple进行类型的转换
>>> t4 = tuple([1,2,3])
>>> type(t4)
<class 'tuple'>
# 创建空元组
>>> t5 = ()
# 任意无符号的对象,以逗号隔开,默认为元组
>>> t6 = 'a','b','c'

元组初始化的

>>> t1 = ('tuple')
>>> type(t1)
<class 'str'>
>>> t2 = (1)
>>> type(t2)
<class 'int'>
>>> t3 = ('tuple',)
>>> type(t3)
<class 'tuple'>
>>> t4 = (1,)
>>> type(t4)
<class 'tuple'>

可以看到当元组只含有一个元素的时候,使用单个()是不行的,python会默认当做是运算符来使用,所以创建元组的时候需要在元素后面加一个逗号;所以还有一个好的习惯就是:写元组的时候,在元素最后加上逗号’,’,避免出现问题

元组的值访问

使用下标索引、切片来访问元组中的值

>>> t1 = (1,2,3,4,5,6,)
>>> t1[3]
4
>>> t2 = ('python', 'tuple','learn',)
>>> t2[1]
'tuple'
>>> t1[1:3]
(2, 3)

在python中,tuple是不允许修改、删除操作的,也就是一个元组没有append、pop、remove等操作,也不需要直接通过索引修改

# 直接修改是非法操作,报错
>>> t1 = (1,2,66,66.66,)
>>> t1[1] = 33
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'tuple' object does not support item assignment

元组的数值不允许修改,但是可以直接使用del语句来删除整个列表

>>> t1 = ('python','is', 'cool',)
>>> print(t1)
('python', 'is', 'cool')
>>> del t1
>>> print(t1)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 't1' is not defined

运算符

元组也有’+‘拼接运算符和’*'重复运算符,元组也是一个序列类型,所以可以进行迭代循环

>>> t1 = ('Python',)
>>> t2 = t1+t1
>>> print(t2)
('Python', 'Python')
>>> t3 = t1*3
>>> print(t3)
('Python', 'Python', 'Python')
>>> for i in t4:
...     print(i, end=' ')
1 2 3 4 5 6 

然后有这么一个问题,看如下代码:

>>> temp = ('a', 'b', 'c', 'd',)
>>> temp = temp[:2] + ('e',) + temp[2:]
>>> print(temp)
('a', 'b', 'e', 'c', 'd')

不是说元组是不可以修改的吗?为什么可以通过拼接改变元组呢?

来解释一下

那我直接先画个图在这里插入图片描述
从图上可以说明,python在创建一个变量的时候,先在id为(12345)的地方申请一块内存,存放 'a','b','c','d',而后采用切片和拼接操作会产生一个新的值 'a','b','e','c','d',这是会申请一个id为(12346)的地址来存放它,而我们的变量名temp只是申请的对象的一个引用,或者是别名。对于概念中的tuple是不可变类型,是指的对象中的没有一个元素不可变,即id为(12345)申请的内存里存的值是不可变得,所以这就解释了为什么temp改变了,因为这个元素的概念并不矛盾。下面代码验证一下

>>> temp = ('a', 'b', 'c', 'd',)
# 原内存地址
>>> id(temp)
2794898490296
>>> temp = temp[:2] + ('e',) + temp[2:]
# 改变过后的内存地址
>>> id(temp)
2794894901760

还有这么一个问题,元组中内嵌列表

>>> t = ('a', 'b', ['A', 'B'],)
>>> t[2][0] = 'X'
>>> t[2][1] = 'Y'
>>> t
('a', 'b', ['X', 'Y'])

这个怎么又变了呢,不是说好的不能变的吗?

同样的道理,t申请了三个变量空间,第一个指向’a’,第二个指向’b’,第三个指向列表,我们在修改的过程中,元组的第三个元素始终指向的是列表的那个id,所以tuple是没有改变的,但是改变的是元组指向的列表。通过画一个图就会更加的清晰
在这里插入图片描述
从图上可以看出,t的第三个元素一直指向的是id为(1234)的地址,元组没有改变,改变的是id(1234)中的值,下面是代码验证

>>> t = ('a', 'b', ['A', 'B'],)
# 获取地址
>>> id(t[2])
2794898559496
# 修改值
>>> t[2][0]='X'
>>> t[2][1]='y'
>>> t
('a', 'b', ['X', 'y'])
# 查看地址,地址没有改变
>>> id(t[2])
2794898559496

元组的内置函数

元组是一个序列,所以也可以使用 len,min,max内置函数操作元组,还有类型转换函数 tuple,还有 in操作

>>> t = (1,2,3,4,5,6,)
>>> len(t)
6
>>> min(t)
1
>>> max(t)
6
>>> 6 in t
True
>>> t1 = ['x','y',]
>>> t2 = tuple(t1)
>>> type(t2)
<class 'tuple'>
>>> t2
('x', 'y')
>>> t3 = (1,1,2,3,4,6,5,)
>>> t3.count(1)
2
>>> t3.index(6)
5

元组的意义,某乎上这一篇就介绍的很好,可以去看一下 (元组的意义

猜你喜欢

转载自blog.csdn.net/EngineerHe/article/details/99416412
今日推荐