Python的可变类型与不可变类型
文章目录
- 简介
- 一段代码
简介
Python的每个对象都分为可变和不可变。在核心类型中
不可变类型:
- 整形
- 字符串
- 元组
可变类型: - 列表
- 字典
对不可变类型的变量重新赋值,实际上是重新创建一个不可变类型的对象,并将原来的变量重新指向新创建的对象(如果没有其他变量引用原有对象的话(即引用计数为0),原有对象就会被回收)。
一段代码
a = [0, 1, 2] # 来个简单的list
# 最初,list 和其中各个元素的id 是这样的。
print ('origin')
print (hex(id(a)),a)
for x in a:
print (hex(id(x)), x)
print ('----------------------')
# 我们把第一个元素改改
print ('after change a[0]')
a[0] = 4
print (hex(id(a)),a)
for x in a:
print (hex(id(x)), x)
print ('----------------------')
# 我们再把第二个元素改改
print('after change a[1]')
a[1] = 5
print (hex(id(a)),a)
for x in a:
print (hex(id(x)), x)
print ('----------------------')
# 回头看看直接写个0 ,id是多少
print ('how about const 0?')
n=0#此时创建一个整形变量,查看其内存地址
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,无论创建多少个不可变类型,只要值相同,都指向同个内存地址。同样情况的还有比较短的字符串。
# 回头看看直接写个0 ,id是多少
print ('how about const 0?')
n=0
print (hex(id(n)), n)
print("how about add n itself?")
n+=1
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引用自这个新的对象。
还没有评论,来说两句吧...