Python中可变变量和不可变变量的赋值、拷贝分析

变量类型

Python变量分为可变变量和不可变变量
不可变变量:整型(int)、字符串型(str)、元组(tuple)
可变变量:列表(list)、集合(set)、字典(dict)

不可变变量

赋值

对同一变量的重复赋值操作,是开辟新的内存空间指向变量

a = 'haha' ; c = 1;d = 257
print(id(a),id(c),id(d))
# 地址 :2104344832240 2104259510512 2104356067888
a = 'hahahahahahah';c = 2;d = 257
print(id(a),id(c),id(d))
#地址 :2104336334576 2104259510544 2104356069072

由测试样例可以推出每一次赋值都是开辟新的内存空间,而不是给原变量内存空间赋不同的值。

PS:验证对同一变量赋相同值的时候,如果用的是整型变量,请选择[-5,256]区间之外的数,原因是Python为了防止重复创建导致内存的增加,事先已经创建好了这些对象,放入到小整数对象池中。每当给变量赋值-5到256之间的数值时,其本质是对小整数对象池中对象的引用,所以地址固定。

拷贝

不可变变量无拷贝操作(PS:不可变变量不能更改数据中的值,只能进行重新赋值,所以也没有讨论的必要)

可变变量

赋值

1.对同一变量的赋值与不可变变量结果相同。
2.不同变量间的赋值相当于引用操作,指向同一存储空间,两个变量等价,任何一方发生改变都会影响另一方

m = [1,2,3]
n = m
print(id(m),id(n))  #2104345865536 2104345865536
n [0] = 6
print(m,n)  #[6, 2, 3] [6, 2, 3]
m[2] = 4
print(m,n)  #[6, 2, 4] [6, 2, 4]

拷贝(以列表为例)

浅拷贝
  • copy()方法
    对于List来说,其第一层,是实现了深拷贝,但对于其内嵌套的List,仍然是浅拷贝。
    因为嵌套的List保存的是地址,复制过去的时候是把地址复制过去了,嵌套的List在内存中指向的还是同一个。

    old = [1,2,[3,4],5]
    new = old.copy()
    new[0] = 9 #第一层实现深拷贝,新列表数值改变不会影响原列表
    new[2][0] = 6 #改变列表里的列表的值,原列表也会发生改变
    print(old) #[1, 2, [6, 4], 5]
    print(new) #[9, 2, [6, 4], 5]
    
  • 列表生成式(等价于for循环遍历生成)
    使用列表生成式产生新列表也是一个浅拷贝方法,只对第一层实现深拷贝。

    old = [1,[1,2,3],3]
    new = [i for i in old]
    new =[]
    for i in range(len(old)):
    new.append(old[i])
    new[0] = 9
    new[1][1]= 6
    print(old) #[1, [1, 6, 3], 3]
    print(new) #[9, [1, 6, 3], 3]
    
  • 切片
    通过使用 [ : ] 切片,可以浅拷贝整个列表,同样只对第一层实现深拷贝。

    old = [1,[1,2,3],3]
    new = old[:]
    new[0] = 9
    new[1][1]= 6
    print(old) 
    print(new)  #输出结果同上
    
深拷贝
  • deepcopy函数

    from copy import deepcopy
    m = [[1,2],3,4]
    n = deepcopy(m)
    n[0][0]=6
    print(m)  #[[1, 2], 3, 4]
    print(n)  #[[6, 2], 3, 4]
    

以上总结均为参考Python选修课课程内容和大佬们的笔记所写,如有错误,欢迎大家在评论区指正。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值