Python碎片日记04——序列、可变性与不可变性、判断可变性的一个误区、主要对象类型的分类和可变性、对象灵活性

本文探讨Python中的序列,如字符串、列表和元组,以及可变性和不可变性的概念。不可变对象包括数字、字符串、元组和集合,可变对象有列表、字典和特定类实例。指出使用is判断对象同一性不等同于可变性,建议使用共享引用测试可变性。文章还概述了主要对象类型的分类和它们的可变性特点。

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

序列

序列包括:字符串、列表和元组。

序列的操作

# s是一个序列
len(s) # 获取长度
sorted(s, key=str.lower, reverse=True)#排序内置函数,也可用于非序列的collection
s[0] # 索引
s[1:3] # slice分片[I:J]取出从偏移量为I开始,直到但不包括偏移量为J的内容,左边默认为0,右边默认序列长度
s + s # 合并
s * 5 # 重复

可变性与不可变性

不可变性:不能通过对对象某一位置赋值而改变改对象,但可以通过建立一个新的对象并以同一个变量名对其进行赋值。
不可变的:数字、字符串、元组、集合
可变的:列表、字典、通过class语句定义的对象

判别可变性的一个误区:

我在别的博客上看到有人认为:对于看起来一模一样的两个对象,可以使用is函数判断,如果为true,则证明该对象是不可变的。<–这句话是错误的!!
is函数是用来判断对象的同一性,这与可变性并不完全一致。对于不可变的类型,也可以存在一模一样但是不同的两个对象。然而,在使用程序测试时,容易出现以下效果:

a = 3
b = 3
a is b #结果为true 

对于一些其他不可变类型的测试也是如此,用is判断的结果和不可变性结果一致,这导致一些人会误以为两者是一样的。但是,如果我们将对象写得复杂些,会发现结果不一样:

a = 3576028602
b = 3576028602
a is b #结果为False

同样都是int数,为什么结果不一样呢?
这是因为Python中有一个缓存机制,对于一些小的、常见的数字和字符串等会进行缓存,在创建变量的时候,并没有新建一个对象而是使用了缓存,因此用is检测的结果是二者都使用的同一个缓存,自然是具有同一性的。但是对于复杂对象,Python并没有缓存,每创建变量都需要创建一个对象,因此是两个不同的对象。
由此可见,is和可变性并无关联!!
那么,如何判别可变性呢?可以使用共享引用的方法测试可变性。详见我的另一个博客Python碎片日记12。

主要对象类型的分类和可变性

在这里插入图片描述
其中,第二行的字符串指的是str和bytes类型字符串。
主要类型分类:
在这里插入图片描述

对象灵活性

对于collection对象类型:
在这里插入图片描述
这种多层嵌套的灵活性可以用来表示树形结构。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值