python堆内存和栈内存区别_Python中id,is,==的区别及内
存管理中的堆和栈
1. id、is、==的区别
id ⽐较对象的内存地址是否相等
== ⽐较对象的值是否相等
is⽐较的是对象的内存和值是否都相等
>>> a = "HUHONG"
>>> b = "HUHONG"
>>> a == b
True
>>> id(a) == id(b)
True
>>> a is b
True
>>> c = "I love China!"
>>> d = "I love China!"
>>> c == d
True
>>> id(c) == id(d)
False
>>> c is d
False
2.堆和栈
Python中对象存储在堆内存,变量其实是对该对象的引⽤。需要注意的是Python中会为匿名列表对象 和匿名字典对象以及短字符串创建缓冲区,并且⾃带⼩对象整数池(-5~256)
杨洋谴责京东侵权列表和字典这种可变对象当为匿名对象是会向外暴露⼀个内存地址,不论⾥⾯的内容怎么变,该地址不变,所以下⾯的地址都⼀样
1. 针对匿名列表和字典对象(即不存在变量名的引⽤)
>>> id([1,2,3]) == id([4,5,6])
True
>>> id([1]) == id([1,2,3,4,5,6])
True
>>> id({1:1, 2:2}) == id({3:3, 4:4})
True
'''
但是如果存在对象的引⽤,即⾮匿名对象,上⾯的结果都是False,如下
'''
>>> a=[1,2,3];
>>> b=[4,5,6]
>>> c={1:1, 2:2}
>>> d={3:3, 4:4}
>>> id(a) == id(b)
False
>>> id(c) == id(d)
False
>>> e = [1,2,3]
>>> a ==e
True
>>> a is e
False
>>> id(a) == id(e)
False
30万以上的车排行榜
2.字符串驻留机制
Python⽀持字符串驻留机制,如果字符串满⾜标识符规则,则只⽣成⼀个字符串对象,赋值只是保存引⽤;否则将⽣成新的字符串对象。
3.针对⼩整数
Python会为(-5,256)之间的整数分配独⽴的内存空间,当有对象调⽤的时候会直接从⾥⾯取地址,不论调⽤多少次,都不会再为这些对象创建新的内存空间
>>> a = -5
>>> b = -5
>>> c = 256
>>> d = 256
一般车险买哪几种>>> e = -6
>>> f = -6
>>> j = 257
>>> k = 257
>>> id(a) == id(b)
True
>>> id(c) == id(d)
True
>>> id(e) == id(f)
False
梗为什么叫梗
>>> id(j) == id(k)
False
4. 针对元祖
>>> a = (1,2,3)
>>> b = (1,2,3)
>>> id(a) == id(b)
False
>>> id((1,2,3)) == id((1,2,3))
True
>>> id((1,2,3)) == id((1,2))
False
>>> id((1,2,3)) == id((1,2,3,4))
False
5. ⼆维列表需要注意浅拷贝
通过 [[0] * 3] * 3这样的形式可以构造⼀个3*3 的⼆维列表,这⾥⽣成的内部3个列表其实是同⼀个对象,修改其中⼀个列表,同时会修改另外的列表。
>>> a = [[0]*3]*3
>>> a
[[0, 0, 0], [0, 0, 0], [0, 0, 0]]
>>> a[0][0] = 1
>>> a
[[1, 0, 0], [1, 0, 0], [1, 0, 0]]
>>> a[0] is a[1]
True
>>> b = a[0] # 浅拷贝
形容冬天的诗句>>> b
[1, 0, 0]
>>> b.append(5)
>>> b
[1, 0, 0, 5]
>>> a
[[1, 0, 0, 5], [1, 0, 0, 5], [1, 0, 0, 5]]
⽣成⼆维列表尽量使⽤列表推导:
>>> a = [[0 for j in range(3)] for i in range(3)]
>>> a
[[0, 0, 0], [0, 0, 0], [0, 0, 0]]
>>> a[0][0] = 1
>>> a
[[1, 0, 0], [0, 0, 0], [0, 0, 0]]
另外列表修改时:append,+= 都是原地修改,+ 为产⽣新对象>>> a = [1,2,3,4,5]
>>> b = a
>>> a.append(6)
>>> print(a, b)
[1, 2, 3, 4, 5, 6] [1, 2, 3, 4, 5, 6]
>>> a += [7]
>>> print(a, b)
[1, 2, 3, 4, 5, 6, 7] [1, 2, 3, 4, 5, 6, 7]
>>> a = a + [8]
刘涛年龄>>> print(a, b)
[1, 2, 3, 4, 5, 6, 7, 8] [1, 2, 3, 4, 5, 6, 7]
×⽤扫描并分享