内存:
- 堆:与栈相比,存储速度要慢,容量大,所以引用类型的数据皆存储此处。(容器类型,类和对象)
- 栈:存储速度快,容量小,如果对应简单数据类型,可以存栈里。(整型,浮点型,布尔型)
编程:数据应该放在哪里?–>看情况
- 赋值号与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]
#而对于容器类型来说,变量的值存储在堆中(因为堆容量大),但是因为堆比较慢,所以把堆的地址放在栈中,变量的值是栈里面的堆地址。
- copy–拷贝(在堆里面把堆中的数据拷贝一份)
eg3:
a = [1,2,3]
b = a.copy()
a[0] = 100
print(a,b)
#[100,2,3],[1,2,3]
- 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