python中可变数据类型和不可变数据类型,浅拷贝、深拷贝、赋值。

可变数据类型:对该类型进行增删改都不会影响内存指向。

常见: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中简单的字符串,布尔值。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值