可变数据类型:对该类型进行增删改都不会影响内存指向。
常见:dict、list、set
1、对于新创建的变量,即使是里面的元素值一模一样,其id也是不同的。是不同的对象。
a=[1,2,3]
b=[1,2,3]
a==b 结果是True
a is b j结果是False,说明a和b不是指向同一块内存地址。修改a,不会影响b。
2、在dict.formkeys('lhz',[])
d=dict.fromkeys('lhz',[]) d['l'].append('12') print(d)结果:{'l': ['12'], 'h': ['12'], 'z': ['12']}
在这个方法中,如果value是可变数据类型,则引用同一个内存地址。
不可变数据类型:str、number、tuple、bool
1、对于不可变数据类型,只要值一样,其id就一样。
2、修改一个不可变数据类型,可以任务就是指向新的内存空间或创建新的内存空间。
a=9000 b=9000 print(a is b)结果:True,
说明对于不可变数据类型,值一样,其就是指向一个内存地址,是同一个对象。
赋值操作:
1、赋值操作就是将变量指向另一个指向的内存地址,两个都指向同一个内存地址
1、如果赋值的数据类型是不可变,则修改一方,不会影响另一方。因为修改,就代表了指向新的内存地址。不会操作原来的内存地址。
2、如果赋值的数据类型是可变的,则修改一方,就会影响另一方。因为可变数据类型的修改,不会改变内存地址指向。所以,对于可变数据类型的变量,尽量不要使用赋值操作。
不要做下面的赋值:
a=[1,2,3]
b=a
a.append('wc')
print(b)
输出;[1,2,3,'wc'] ,你没有对b追加wc,但是b中就是有了wc。因为a和b指向的是同一个内存地址,且list是可变数据类型,添加数据不会改变内存地址的指向。
浅copy:
a=[1,2,3,[4,5]]
b=copy(a)
a[-1].append(10)
a[0]=10
print(b)
输出:[1,2,3,[4,5,10]]
1、会给b新建内存空间,b指向新的内存空间
2、b会引用a中所有元素,
3、若元素中有可变数据类型,则一方对可变元素进行修改,另一方的可变元素也会修改。
深拷贝:copy.deepcopy()
a=[1,2,3,[4,5]]b=copy.deepcopy(a)
a[-1].append(10)
print(b)
结果:[1,2,3,[4,5]]
1、给b新创建一个内存空间,b指向新的内存空间
2、b会引用a中不可变数据类型的元素,对于可变数据类型元素,会新创建内存空间保存数据。
3、这样a修改可变类型的元素,不会影响到b。因为a和b指向的可变类型元素的内存地址已经不是同一个了。
数据池:
在python中,有些数据在内存中只保留一份,
int中-5到256,str中简单的字符串,布尔值。