Python的可变类型与不可变类型

「爱情、让人受尽委屈。」 2022-01-30 14:35 603阅读 0赞

文章目录

  • 简介
  • 一段代码

简介

Python的每个对象都分为可变和不可变。在核心类型中

不可变类型:

  • 整形
  • 字符串
  • 元组
    可变类型:
  • 列表
  • 字典
    对不可变类型的变量重新赋值,实际上是重新创建一个不可变类型的对象,并将原来的变量重新指向新创建的对象(如果没有其他变量引用原有对象的话(即引用计数为0),原有对象就会被回收)。

一段代码

  1. a = [0, 1, 2] # 来个简单的list
  2. # 最初,list 和其中各个元素的id 是这样的。
  3. print ('origin')
  4. print (hex(id(a)),a)
  5. for x in a:
  6. print (hex(id(x)), x)
  7. print ('----------------------')
  8. # 我们把第一个元素改改
  9. print ('after change a[0]')
  10. a[0] = 4
  11. print (hex(id(a)),a)
  12. for x in a:
  13. print (hex(id(x)), x)
  14. print ('----------------------')
  15. # 我们再把第二个元素改改
  16. print('after change a[1]')
  17. a[1] = 5
  18. print (hex(id(a)),a)
  19. for x in a:
  20. print (hex(id(x)), x)
  21. print ('----------------------')
  22. # 回头看看直接写个0 ,id是多少
  23. print ('how about const 0?')
  24. n=0#此时创建一个整形变量,查看其内存地址
  25. print (hex(id(n)), n)

输出:

origin
0x2e45ac8 [0, 1, 2]
0x5b57c690 0
0x5b57c6b0 1
0x5b57c6d0 2

after change a[0]
0x2e45ac8 [4, 1, 2]
0x5b57c710 4
0x5b57c6b0 1
0x5b57c6d0 2

after change a[1]
0x2e45ac8 [4, 5, 2]
0x5b57c710 4
0x5b57c730 5
0x5b57c6d0 2

how about const 0?
0x5b57c690 0

总结:看到列表里的元素0和在列表外定义的一个普通整形变量指向同一个内存地址,由此得知,对于不可变类型int,无论创建多少个不可变类型,只要值相同,都指向同个内存地址。同样情况的还有比较短的字符串。

  1. # 回头看看直接写个0 ,id是多少
  2. print ('how about const 0?')
  3. n=0
  4. print (hex(id(n)), n)
  5. print("how about add n itself?")
  6. n+=1
  7. print (hex(id(n)), n)

输出:
how about const 0?
0x5b57c690 0
how about add n itself?
0x5b57c6b0 1
相当对不可变类型重新赋值,实际上 n += 1 并不是真的在原有的int对象上+1,而是重新创建一个n为1的int对象,n引用自这个新的对象。

发表评论

表情:
评论列表 (有 0 条评论,603人围观)

还没有评论,来说两句吧...

相关阅读

    相关 python 可变可变变量

    不可变变量 操作某个对象时,重新开辟了内存,使其内存地址改变了,我们称其为可变对象,反之称为不可变变量 我们可以通过下面的例子来感受上面的话 x=1