堆和栈以及深浅拷贝

内存:

  • 堆:与栈相比,存储速度要慢,容量大,所以引用类型的数据皆存储此处。(容器类型,类和对象)
  • 栈:存储速度快,容量小,如果对应简单数据类型,可以存栈里。(整型,浮点型,布尔型)

编程:数据应该放在哪里?–>看情况

  1. 赋值号与copy的区别:
    赋值号,就是将一个值给等号左边的变量或者对象。

   eg1:
       a = 10
       b = a 
       a = 12
       print(a,b)
       #12,10
       #因为是把值给对象,但是对于整型、浮点型和布尔型数据来说是存在栈里面。所以只是把值给了变量,值的改变不对其他变量产生影响。
   eg2:
       a = [1,2,3]
       b = a
       a[0] = 100
       print(a,b)
       #[100,2,3],[100,2,3]
       #而对于容器类型来说,变量的值存储在堆中(因为堆容量大),但是因为堆比较慢,所以把堆的地址放在栈中,变量的值是栈里面的堆地址。
  1. copy–拷贝(在堆里面把堆中的数据拷贝一份)
    eg3:
    a = [1,2,3]
    b = a.copy()
    a[0] = 100
    print(a,b)
    #[100,2,3],[1,2,3]
  1. copy and deepcopy
    eg4:
       a = [1,2,[3,4]]
       b = a.copy()
       a[2][0] =100
       print(a,b)
       #[1,2,[300,4]],[1,2,[300,4]]
   解释:
       [1,2,[3,4]]
       #对于上面的列表
       #存放在堆里面
       #但是[3,4]又是对象,所以[3,4]又另外存储
       #形成如[1,2,0x002]->0x001,[3,4]->0x002的存储形式。
       #对于copy只是拷贝了0x001的内容,但是里面有内存地址,又指向0x002的内容,所以修改会影响内容。

eg5:

   import copy
   a = [1,2,[3,4]]
   b = copy.deepcopy(a)
   a[2][0] =300
   print(a,b)
   #[1,2,[300,4]],[1,2,[3,4]]

解释:
[1,2,[3,4]]
对于上面的代码,
存放在堆里面
但是[3,4]又是对象,所以[3,4]又另外存储
形成如[1,2,0x002]->0x001,[3,4]->0x002的存储形式。
deepcopy将[1,2,0x002]拷贝到0x003里面
但是deepcopy看到里面存在引用的内容,所以又将引用的内容拷贝到0x004。
形成如:
[1,2,0x002]->0x001,[3,4]->0x002
[1,2,0x004]->0x003,[3,4]->0x004

面试题:
is 跟 == 的区别:
is :是不是(同一对象)–id是否相同
==:等不等(值等不等)–比较最终的值

   a = 100
   b = 100
   print(a == b)
   print(a is b)
   #True
   #True

特别注意:

   a = 11111111111101
   b = 11111111111101
   print(a == b)
   print(a is b)
   #True
   #False
   '''
   python 里面有一个数值范围
   这个范围决定了上面的输出结果
   当有值超出这个范围之后,
   a is b 的结果就是:Faalse
   '''

简单的数字,可能会被频繁用到,存储在宝贵栈(小)中,拿取的速度快。

   class People():
       pass
   a = People()
   b = People()
   print(a == b)
   print(a is b)
   #False
   #False
   '''
   is 判断是不是同一个对象,栈
   == 比较最终值,即堆里面的数值
   '''
   c = a 
   print(a == b)
   print(a is b)
   #True
   #True
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值