我们已经知道了一些关于链表序列的知识。今天,我们知道了下一个序列元组tuple。
元组是常用的不可变序列;据说tuple类似于list list,只不过tuple一旦创建就无法更改。
是真的吗?/你不说。元组中的元素真的不能修改吗?而元组和列表的区别是什么?让我们去了解一下:
首先是元组的定义。它是用括号创建的,元素项用逗号分隔。示例代码:
根据运行结果,不难看出元组中的元素项也可以是不同类型的对象,与list list相同;上面的列表list用括号[]定义;两者的元素都用逗号分隔。
如何定义一个元组中何时只有一个元素?示例代码:
从上面的结果我们得出结论:当tuple中只有一个元素时,必须在元素后加一个逗号;否则Python解释器会把括号作为运算符计算,结果是5的整数;为了消除这种歧义,Python要求在定义只有一个元素的元组时,必须在元素后加一个逗号;这与列表不同。
元组索引和切片
元组的索引和切片方法与链表基本相同;
都遵循[头下标:尾下标]“左闭右开”的原则,也称“左无右”原则。示例代码:
让我们修改其中一个元素:
呃?!为什么报错了?提示元组对象不支持元素赋值。
哦,这就是我们常说的“tuple tuple一旦定义就不能更改”。
元组嵌套,实例代码:
我们试着把tuple里的‘Java’改成‘Go’。示例代码:
呃?不是说元组一旦定义了就不能改了吗?怎样才能再次改变它们?这就让人迷茫了!细心的朋友会发现,改变的元素是列表类型,因为列表是变量类型;
你说得对,是这样的。如果元组中的元素是不可变类型对象,如常量、字符串等。,修改这些不可变元组的元素时会报错;如果元组中的元素是可变对象,比如list list,那么它可以被修改,并且不会报告错误。
表面上看,tuple的元素确实发生了变化,但实际上并不是tuple的元素,而是list的元素。
#让我们再举一个例子,继续分析:
前两个del报告错误,表示一旦创建了元组,就不能删除该元素;其实字符串也有这个属性。一旦创建,里面的单个字符串就不能删除。
Del三次后删除了可变元素列表中的子元素。在可变元素列表中的所有子元素都被删除后,如果继续删除它们,将会报告TypeError错误。
上面的例子用id来“监控”元组最后一个元素的内存地址变化,发现无论怎么删除,它的内存地址都保持不变。
如果我们给最后一个变量元素赋值会怎么样?示例代码:
报告上述IndexError下标越界异常是因为此时tuple_org[-1]已经是空 list [],并且其中没有元素。[0]表示第1个元素的位置,因此报告错误;
在上面例子的整个过程中,无论最后一个元素如何赋值,都会报错。
Tuple_org[-1],你去泰国了吗?变性人?
言归正传,结合上面的例子和id函数的输出结果,我们来分析一下:
元组是不可变的序列。所谓元组“不可变”,就是元组中每个元素的内存点永远不变。的所有不可变序列在第一次定义后都不能修改。它包含对其他对象的引用,这些对象可能是可更改或可修改的。
虽然元组中的元素值不允许修改,但是我们可以用=拼接元组。示例代码:
在+= append操作之后,A元组的内存地址发生了变化,因为它重新分配了新元素的内存地址。
Python内置函数:
找出序列中元素的个数,并对序列进行排序。示例代码:
注意:排序内置函数对元组排序时,返回的是一个排序后的列表对象,而不是一个新的元组对象,元组本身没有变化;
将元组转换为列表,示例代码:
虽然不允许删除元组中的元素值,但是我们可以使用del语句删除整个元组。示例代码:
对了,元组没有自己的方法,而列表有自己的操作方法。
最后,我们总结一下:
元组本身所指向的内存实际上保存了元组中数据的内存地址集。一旦建立了元组,就不能修改或删除这个存储器地址集。一旦集合中的地址改变,必须重新分配元组空来保存新的存储器地址集合。
顺便说一句:
还有一个升级版的tuples: namedtuple,是集合模块中的函数对象。
命名元组会在后续的面向对象程序中介绍给你,因为需要和类对象结合使用才能更清晰。感兴趣的朋友可以先自己了解一下。
看了上面的例子和分析,你对tuple这种不可变的序列有更深的理解吗?
好吧!Python数据类型中的tuple tuple元组在此分享。如有疑问,请在评论区留言,我会及时回复。谢谢!