Python数据类型之元祖

本文深入解析Python中的元祖数据类型,包括元祖的创建、查询、统计和删除操作。通过实例展示元祖作为只读列表的特点,以及其内部元素在特定条件下的可变性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

python中有一个很奇怪的数据类型-----元祖(tuple),元祖由括号()表示,被称为只读列表,顾名思义,元祖可以看成一个列表,但是只有查询的操作。

1、元祖的创建

# 元祖的创建
# -*- coding:utf-8 -*-
# author: kenny

# 元祖的创建
# 创建方法一:多个元素情况,我们可以直接创建(不推荐)
tuple_1 = 1, 2, 3, 4
print(tuple_1)  # (1, 2, 3, 4)
# 创建方法二:用tuple()创建
tuple_2 = tuple((1, 2, 3, 4, 5))
print(tuple_2)  # (1, 2, 3, 4, 5)
# 创建方法三:用()创建
tuple_3 = (1, 2, 3, 4, 5, 6)
print(tuple_3)  # (1, 2, 3, 4, 5, 6)

需要注意的是,元祖都是一组一组的,单个元素不能创建为元祖,此时数据的类型为单个元素本身的类型。如果想创建单个元素的元祖,需要在创建的时候在元素后面加逗号,如下例:

tuple_4 = (1)
print(type(tuple_4))  # <class 'int'>
tuple_5 = ("1001")
print(type(tuple_5))  # <class 'str'>
tuple_6 = ("1002",)
print(type(tuple_6))  # <class 'tuple'>

2、元祖的查询

tuple_7 = (1, 2, ['a', 'b', 'c'], 'd', 'e', ('name', 'city'))
# 打印索引为0的元素
print ("tuple_7[0] =", tuple_7[0])  # tuple_7[0] = 1

# 切片:从索引为1到最后一个元素
print ("tuple_7[1:] =", tuple_7[1:])   # tuple_7[1:] = (2, ['a', 'b', 'c'], 'd', 'e', ('name', 'city'))

# 切片:从第一个元素到倒是第二个元素
print ("tuple_7[:-1] =", tuple_7[:-1])  # tuple_7[:-1] = (1, 2, ['a', 'b', 'c'], 'd', 'e')

# 等价于tuple_7[1:]   从左到右一个个去取,步长为1
print ("tuple_7[1::1] =", tuple_7[1::1])  # tuple_7[1::1] = (2, ['a', 'b', 'c'], 'd', 'e', ('name', 'city'))

# 反向输出 步长为1
print ("tuple_7[::-1]", tuple_7[::-1])   # tuple_7[::-1] (('name', 'city'), 'e', 'd', ['a', 'b', 'c'], 2, 1)

# 反向输出 步长为2(隔一个去取))
print ("tuple_7[::-2]", tuple_7[::-2])   # tuple_7[::-2] (('name', 'city'), 'd', 2)

# 统计元素个数
print(tuple_7.count("2"))  # 0

#  返回元素的索引位置
print(tuple_7.index(2))  # 1

# 计算元组中元素的个数
print(len(tuple_7))  # 6

之所以说元祖很奇怪,是因为元祖本身是不可变数据,即元祖一旦被定义,数据便不能被修改了,但是有时候我们会看到有些操作可以元祖的数据,例如下面的例子:

tuple_8 = (1, "a", ["list_1", 2])
print(tuple_8)  # (1, 'a', ['list_1', 2])
tuple_8[2].append("list_add")
print(tuple_8)  # (1, 'a', ['list_1', 2, 'list_add'])

这是为什么呢,不是说元祖一旦被确定,数据就不能被修改了吗。其实元祖不能被修改是简单的说法,全称是元祖内元素在内存中的地址不能被修改,就如上个例子,与其说是元祖的数据被修改,不如说是元祖内的列表的数据被修改,因为列表是可变数据,修改列表的数据后列表的地址不变,所以元祖来说地址并没有发生变化。

3、删除元祖

咦?不是说元祖只有查询操作吗?为什么又能删除了呢?对于这一点疑问,我想说的是:这不是删除元祖的元素,而是删除元祖这个对象(好吧,只是我凑字数来了)

tuple_9 = (1, "a", ["list_1", 2])
print(tuple_9)  # (1, 'a', ['list_1', 2])
del tuple_9
print(tuple_9)  # NameError: name 'tuple_9' is not defined

 

### Python 数据类型之间的区别与用法对比 #### 不同数据类型的特性 Python 中的数据类型分为多种类别,每种类型都有其独特的特性和用途。以下是几种主要数据类型的比较: 1. **List 和 Tuple 的差异** list 是一种可变序列,支持动态修改操作,而 tuple 则是一种不可变的 list[^2]。这意味着一旦定义了一个 tuple,就不能再对其内容进行增删改操作。 2. **Set 的特点** set 类似于没有 value 的 dict,它只保存唯一的 key 值,并且这些值是无序的。由于它的内部实现基于哈希表,因此查找速度非常快。另外需要注意的是,set 支持动态添加和删除元素,但它不允许重复项存在。 3. **Dict 的功能** 字典(dict)作为 Python 中唯一内置的支持映射关系的数据结构,提供了键值对的形式来存储信息[^4]。其中的关键点在于: - 键必须是不可变对象(如整数、浮点数、字符串或元组),但不能使用列表或其他可变集合作为键; - 同一时间内每个键只能对应一个值,如果有重复赋值情况发生,则后者会覆盖前者。 4. **单一类型容器** 对于 str、bytes、bytearray 等特殊容器来说,它们仅能容纳相同种类的数据单元[^3]。例如 bytearrays 只允许包含字节级数值范围内的成员(0~255),这使得这类容器非常适合处理二进制文件或者其他低层次位模式需求场景下的应用开发工作。 #### 使用实例展示 下面给出一些简单的例子帮助理解上述概念: ```python # List 示例 my_list = ["apple", "banana", "cherry"] print(my_list) # 修改第一个元素 my_list[0] = "orange" print(my_list) # 添加新元素到末尾 my_list.append("grape") print(my_list) # Tuple 示例 my_tuple = ("apple", "banana", "cherry") print(my_tuple) try: my_tuple[0] = "orange" # 这里会产生错误因为无法更改元祖的内容 except TypeError as e: print(f"Tuples are immutable! Error message:{e}") # Set 示例 fruit_set = {"apple", "banana", "cherry"} print(fruit_set) # 尝试增加已有项目不会生效 fruit_set.add("apple") print(fruit_set) # 成功新增另一水果 fruit_set.add("watermelon") print(fruit_set) # Dict 示例 person_info = { 'name': 'Alice', 'age': 25, 'city': 'New York' } print(person_info['name']) # 更新年龄字段 person_info.update({'age': 26}) print(person_info.get('age')) # String 单独字符访问 greeting = "Hello world!" first_char = greeting[0] last_char = greeting[-1] substring = greeting[:5] print(first_char, last_char, substring) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值