所谓数据的可变性,创建之后,能否被改变。对于初学者,很难区分一种数据(类型)是否可变。
不可变的数据类型
python的不可变数据类型包括:int,float,complex,bool,str。python中数据是否可变的判断标准,内建的id函数
>>> help(id)
Help on built-in function id in module __builtin__:
id(...)
id(object) -> integer
Return the identity of an object. This is guaranteed to be unique among
simultaneously existing objects. (Hint: it's the object's memory address.)
>>>
我们来看几个例子
- complex,复数
>>> ac = 1+3j
>>> ac
(1+3j)
>>> id(ac)
47494520
>>> ac += 1
>>> ac
(2+3j)
>>> id(ac)
46163512 - bool
>>> ab = True
>>> idab = id(ab)
>>> idab
505509720
>>> ab = False
>>> id(ab)
505509708 - str,字符串,这个不大容易理解。我当初也觉得很不可思议,字符串怎么还能是不可变的了呢,下面我们来看看
>>> my_str += ',hao old are you?'
>>> id(my_str)
48214384
>>> my_str
'I am 26 years old,hao old are you?'
>>> my_str.replace('26','27')
'I am 27 years old,hao old are you?'
>>> id(my_str)
48214384
>>> my_str
'I am 26 years old,hao old are you?'
>>>
可变的数据类型
python中可变的数据类型有:list、dict,下面我们来看看例子。
1. 可以在列表中追加(append)、移除(remove)、插入(insert)、扩展(extend)、排序(sort)等,而不改变列表的id
>>> al = [1,2,3]
>>> id(al)
47518584
>>> al.append(4)
>>> al
[1, 2, 3, 4]
>>> id(al)
47518584
>>> al.remove(2)
>>> al
[1, 3, 4]
>>> id(al)
47518584
>>> al.insert(1,2)
>>> al
[1, 2, 3, 4]
>>> id(al)
47518584
>>> al.extend([5,6])
>>> al
[1, 2, 3, 4, 5, 6]
>>> id(al)
47518584
>>> al.sort(reverse=True)
>>> al
[6, 5, 4, 3, 2, 1]
>>> id(al)
47518584
>>>
- 可以改变字典中已有键对应的值(d[key] = new_value)、弹出指定键(pop(key,default))、弹出键-值对(popitem)、更新(update(other_dict))等而不改变字典的id
>>> ad = {'name': 'an', 'age': 26}
>>> id(ad)
47542112
>>> ad['age'] = 27
>>> ad
{'age': 27, 'name': 'an'}
>>> id(ad)
47542112
>>> ad.pop('age')
27
>>> ad
{'name': 'an'}
>>> id(ad)
47542112
>>> ad['age'] = 27
>>> ad
{'age': 27, 'name': 'an'}
>>> id(ad)
47542112
>>> ad.popitem()
('age', 27)
>>> ad
{'name': 'an'}
>>> id(ad)
47542112
>>> ad.update({'age': 27, 'sex': 'man'})
>>> ad
{'age': 27, 'name': 'an', 'sex': 'man'}
>>> id(ad)
47542112
>>>
“不严格”不可变数据
元组是python中比较特殊的一种数据类型,他不是严格的不可变类型,但划分上通常会把他划分到不可变类型中去
- 不可变性,元组没有修改其中属性的方法,自然不能改变其中的值;+=、*=等对元组的运算将改变元组的id
- 我们把重点放在元组的可变性上,当元组中的元素为可变数据类型时,元组实质上是可以被改变的(但id没变)
>>> at = (1,2,[3,4],{'name': 'an', 'age': 27})
>>> at
(1, 2, [3, 4], {'age': 27, 'name': 'an'})
>>> id(at)
47918416
>>> at[2].append(5)
>>> at
(1, 2, [3, 4, 5], {'age': 27, 'name': 'an'})
>>> id(at)
47918416
>>> at[3]['age'] = 28
>>> at
(1, 2, [3, 4, 5], {'age': 28, 'name': 'an'})
>>> id(at)
47918416
>>>
一种数据类型是否可变,可以通过内建函数id(object) -> integer来判断