list是可变序列,tuple和str都是不可变的

本文探讨了Python中列表与元组的数据结构特性,重点分析了列表的可变性与元组的不可变性。通过示例代码展示了如何修改列表元素,以及尝试修改元组元素时会遇到的错误。

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

lst[0] = 5
print(lst)
# 这里修改了lst的索引0的值,且这里索引0的值是一个数字

tup = (1,2,3,4,5)
tup[0] = 5
print(tup)
# 这里会报错

st = 'abcdefg'
st[0] = 'g'
print(st)
# 同样也会报错
### Python 字典数据结构特性解释 #### 1. 字典为何不属于序列? 在 Python 中,序列是一种特定类型的数据结构,其特点是按照索引顺序存储元素。常见的序列包括字符串(`str`)、列表(`list`)元组(`tuple`),它们都支持通过整数索引来访问其中的元素[^1]。 然而,字典(`dict`)并不属于序列的原因在于它并不是基于索引进行存取的。相反,字典是以键值对的形式来组织数据,其中每个键与其对应的值之间存在映射关系。因此,字典无法像序列那样提供按位置访问的功能[^2]。 #### 2. 键需为不可变对象的理由 为了确保字典能够高效运行并保持一致性,其键必须满足两个条件:唯一性不变性。具体来说: - **唯一性**:在一个字典中,所有的键都是唯一的。如果尝试向字典添加已存在的键,则新值会覆盖旧值。 - **不变性**:由于字典内部实现依赖于哈希表机制,而计算哈希值的前提是输入的对象在其生命周期内不会发生变化。只有当键是一个不可变对象时,才能保证每次调用 `hash()` 函数得到的结果一致,从而维持整个字典操作逻辑正常运作[^3]。 例如,在下面的例子中展示了为什么可变类型的实例不适合作为字典的键: ```python lst = [1, 2, 3] dct = {lst: 'value'} # TypeError: unhashable type: 'list' ``` 这里试图把一个列表作为字典的一个键,但由于列表是可以被修改的内容,所以抛出了异常提示该类别的对象不能用于创建散列值。 另外值得注意的是某些看似固定但实际上可能变化的情况也会影响正确性。比如虽然单个数值或者字符串本身看起来稳定,但如果组合成更复杂的结构体如自定义类实例就可能存在隐患除非特别设计使其具备恰当行为模式[^4]。 综上所述,正是出于性能考虑以及维护数据完整性的需求决定了Python里规定仅允许那些本质上具有恒定特性的实体充当字典项的关键部分即所谓"不可变序列"属性要求。 #### 示例代码展示 以下是一些关于字典基本使用的例子及其验证过程说明上述理论依据实际应用效果如何体现出来: ```python # 正确使用不可变类型作为键 immutable_dict = { "string_key": "This is a string key", ("tuple", "as", "key"): ["List as value"], frozenset([1]): {"Another dictionary"} } print(immutable_dict["string_key"]) # 输出 This is a string key print(immutable_dict[("tuple", "as", "key")]) # 输出 ['List as value'] print(immutable_dict[frozenset([1])]) # 输出 {'Another dictionary'} try: mutable_dict = {[1]: "Error"} # 尝试用列表作键引发错误 except TypeError as e: print(e) # 输出 unhashable type: 'list' def custom_class(): class MyClass: def __init__(self, val): self.val = val def __eq__(self, other): # 定义相等方法使得能比较不同实例间的关系 return isinstance(other, MyClass) and self.val == other.val def __hash__(self): # 自定义哈希函数让此类成为合法候选者之一可用于构建集合或字典中的键角色扮演 return hash(self.val) my_obj_1 = custom_class() my_obj_2 = custom_class() custom_dict = {} custom_dict[my_obj_1] = "First object" custom_dict[my_obj_2] = "Second object" if my_obj_1 != my_obj_2: # 即便两者内存地址不一样只要遵循__eq__规则判定标准下认为相同即可共享同一入口指向目标资源单位 assert False # 如果到达此处意味着违反预期设定情况发生应立即终止程序执行流程进一步排查原因所在之处到底何方神圣搞砸了这一切美好愿景啊!!! for k,v in custom_dict.items(): # 遍历打印所有项目确认无误后再继续往下走下一步骤动作安排计划部署实施落地开花结果丰收喜悦满满哒~ print(f"{k}:{v}") ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值