序列
序列包括:字符串、列表和元组。
序列的操作
# 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对象类型:
这种多层嵌套的灵活性可以用来表示树形结构。