您的位置:

python不可变性(可变和不可变python)

本文目录一览:

python变量的可变与不可变类型

(1)数字类型(int,float, bool,complex)

(2)字符串(str)

(3)元组(tuple)

(1)列表(list)

(2)字典(dict)

示例-不可变类型:

结果:

示例-可变类型:

结果:

示例1:

结果:

示例2:

结果:

hash(object) 返回对象的哈希值。

(1)只能接受不可变类型的数据作为参数

(2)返回的是一个整数,是数据的唯一特征码(就像人的指纹一样)

(3)在python中,设置字典键值对时,会首先对key进行hash,用来决定如何在内存中保存字典的数据,以方便后续对字典进行增删改查;

python不可变性和可变性的区别

Python中的元组是一种类似于列表的容器类型,但列表是可变的而元组不可变。

元组本身是不可变的,但是它所包含的元素的可变性取决于该元素的属性。

如:t = (17, 'Jesse', ('LinuxKernel', 'Python'), [17, 'Jesse'])

元组t中的元素数字17和字符串‘Jesse’以及元组('LinuxKernel', 'Python')本身属于不可变元素,故其在元组中不可更新;但是其中包含的列表[17, 'Jesse']本身属于可变元素,故:

t = (17, 'Jesse', ('LinuxKernel', 'Python'), [17, 'Jesse'])

t

(17, 'Jesse', ('LinuxKernel', 'Python'), [17, 'Jesse'])

t[0] = 18

Traceback (most recent call last):

File "stdin", line 1, in module

TypeError: 'tuple' object does not support item assignment

t[3]

[17, 'Jesse']

t[3][0] = 21

t

(17, 'Jesse', ('LinuxKernel', 'Python'), [21, 'Jesse'])

由于元组的不可变性,所以它也没有列表的一些能改变自身的方法,如sort或reverse等(元组中的元素根据其本身属性可能有)。

列表的一些属性和方法:

dir(list)

['__add__', '__class__', '__contains__', '__delattr__', '__delitem__', '__delslice__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getslice__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__rmul__', '__setattr__', '__setitem__', '__setslice__', '__sizeof__', '__str__', '__subclasshook__', 'append', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort']

元组的一些属性和方法:

dir(tuple)

['__add__', '__class__', '__contains__', '__delattr__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__getslice__', '__gt__', '__hash__', '__init__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmul__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'count', 'index']

通过比较两者的属性和方法,可以验证上一结论。

虽然列表与元组有些不同,但是它们还是有很多相似的地方:

1. 创建方法类似:

创建一个列表:l = [123, 'abc' , (1, 2, 3)]

创建一个元组:t = (123, 'abc', (1, 2, 3))

2. 都支持下标操作:

l[1]

'abc'

t[1]

'abc'

3. 都支持切片操作:

l[0:-1]

[123, 'abc']

t[0:-1]

(123, 'abc')

4. 支持重复操作:

l * 2

[123, 'abc', (1, 2, 3), 123, 'abc', (1, 2, 3)]

t * 2

(123, 'abc', (1, 2, 3), 123, 'abc', (1, 2, 3))

5. 支持连接操作(当然只能由同类型连接):

l + [3, 7, 6]

[123, 'abc', (1, 2, 3), 3, 7, 6]

t + (3, 7, 6)

(123, 'abc', (1, 2, 3), 3, 7, 6)

6. 还有拷贝,比较,成员关系操作等等

Python字符串

字符串 :在python中是作为序列存在的,序列中的元素具有从左到右的顺序,并根据他们的相对位置进行读取和储存。严格意义来说,字符串是一系列单个字符组成的序列,其他类型的序列还包括列表和元组。在一串字符两侧加上双引号或者单引号即可创建字符串。

注意 :如果字符串中需要出现双引号或者单引号,则有两种方法。

1)使用转义字符(\)进行转义。

2)将双引号和单引号配合使用,即若向想打印单引号,可以使用双引号表示字符串,在字符串中只用一个单引号。反之亦然。

在一个字符串前面加上r;则会自动为字符串中的反斜杠\转义,使其只代表一个反斜杠\。但是注意,原始字符串最后不能有反斜杠\,否则会发生语法错误。如果非要在原始字符串最后加上,则可以写为\。

运行结果为:

有时我们需要创建一个跨行的字符串,则可以使用三引号来创建。

运行结果为

1)可以通过len()函数得到序列的长度。

运行结果为:

2)可以通过索引操作得到序列的各个元素值。python中序列的索引是从0开始依次向后推移。

运行结果为:

3)python还支持反向索引,是从最后一个向前推移的。-1是指序列中的最后一个元素值,-len(str)是指该序列的第一个元素值。

运行结果为:

4)序列还支持一种 分片(slice) 的操作,这是一种能够一步提取整个分片的方法。

分片可以看作是字符串中一部提取出其中一部分的方法。其一般形式为:X[I:J],表示从X序列中取出第I个元素到不包含第J个元素的部分,结果为返回一个新的对象。

运行结果为:

在一个分片(slice)中,左边界默认为0。同时应注意负偏移量在分片中的边界,也应为左侧数字比右侧数字小。拷贝全部字符串的用法为str[:]。

运行结果为:

5)作为一个序列,字符串还支持用“+”来合并字符串。

运行结果为:

6) 不可变性 ,python中字符串具有不可变性,在创建一个字符串之后不可以通过对其某一位置进行赋值而改变该字符串,但可以通过创建一个新的字符串并以同一个变量名命名。

运行结果为:

7)除了一般的序列操作,字符串还有一些其特有的操作方法。

如find()方法,可以用于查找一个子字符串,可以返回该子字符串的索引值。但如果存在多个符合的子字符串,只会返回第一个索引值。如果不存在该子字符串,则返回-1。replace(S1,S2)方法会将字符串中的S1替换为S2。

运行结果如下:

关于字符串,python还有许多内置函数,可以通过调用dir()函数来查看。