- 在线时间
- 661 小时
- 最后登录
- 2023-8-1
- 注册时间
- 2017-5-2
- 听众数
- 32
- 收听数
- 1
- 能力
- 10 分
- 体力
- 55570 点
- 威望
- 51 点
- 阅读权限
- 255
- 积分
- 17622
- 相册
- 0
- 日志
- 0
- 记录
- 0
- 帖子
- 447
- 主题
- 326
- 精华
- 1
- 分享
- 0
- 好友
- 79
TA的每日心情 | 慵懒 2020-7-12 09:52 |
|---|
签到天数: 116 天 [LV.6]常住居民II 管理员
 群组: 2018教师培训(呼和浩 群组: 2017-05-04 量化投资实 群组: 2017“草原杯”夏令营 群组: 2018美赛冲刺培训 群组: 2017 田老师国赛冲刺课 |
一、id,is,==7 O \% ]4 n/ A, G
Python中一切皆对象。对象包含三个要素,id、type、value。5 `0 u9 t7 H3 H# j4 s
3 c4 r+ z* U- ^( Z, j5 z" ]id 是对象的内存地址。每当我们创建一个对象的时候都会在内存中开辟一块空间,将这个对象的数据临时存放到内存中,id就是这个空间的唯一标号,就好比身份证号。0 g( [6 i/ r8 @2 U' Y0 k
9 g- x, f5 U2 c# z: V8 T2 n
type 是对象的数据类型。包括 int(包括long)、float、string、list、tuple、dict、bool和NoneType 等。- f9 P% S S9 g3 [' {
& g5 A; u& v4 m; _7 t6 e
value 是对象指向的内存地址中存放的具体的值。
. o4 [; h( I) d6 b7 C
8 z, D/ c7 j, X/ y$ r m因为在对象具有这些要素,所以我们用 is 和 == 两个表达式来判断两个对象是否”相等“$ I5 w5 j9 F/ @ b9 n' p
/ Z h/ v6 ]" |1 e' x1 J6 Tis 用于比较两个对象的地址(也就是 id)是否相同,而 == 用于比较两个对象引用的值是否相同
- V+ h T: S, p![]()
0 E* x: \- `+ o+ E
- P; n u* U, p( n1 ?6 P我们也可以用身份证来理解:每个人都相当于一个对象,而身份证号(id)就唯一标识了世界上的每一个人;可能会存在姓名(value)相同(譬如两个人都叫阿玮),而身份证号不同的两个人。所以说如果内存地址相同,那么值肯定相同;但是如果值相同,内存地址不一定相同。& T4 _6 g# W3 ]0 K) ]0 f
' {( ]' G8 O D/ m
二、代码块
3 B/ j& N+ v1 u: {1 fPython程序是由代码块构造的。块是一个 Python 程序的文本,他是作为一个单元执行的) S/ V, J O; f+ g# V& }
7 b+ l7 d3 x" D( W7 q: `
代码块:一个模块,一个函数,一个类,一个文件等都是一个代码块9 P. I6 T! N/ C! V
- \( G$ b" u8 [ e6 Y而作为交互方式输入的每个命令都是一个代码块(如在 iPython)环境中,如:
0 Y+ }3 t3 }8 e6 ?, I* A, E f& N# x1 A+ @
. Y1 Y3 \0 O- D而对于同一个文件中的两个函数,也属于两个分别的代码块:
8 Z: }' y% B9 P' H: w+ @% r5 Y
# h4 H# T! Z" e) \ ) b) q6 s. X- D/ j+ @* ^# N
代码块的缓存机制
- [) @, F$ x5 k% P4 [& f) w* \5 P前提条件: 同一代码块
& G5 f6 W- X* s2 f( d& Y# H) }
* J8 y, Z B$ g G机制内容: Python在执行同一个代码块的初始化对象的命令时,会检查是否其值是否已经存在,如果存在,会将其重用。换句话说:执行同一个代码块时,遇到初始化对象的命令时,他会将初始化的这个变量与值存储在一个字典中,在遇到新的变量时,会先在字典中查询记录,如果有同样的记录那么它会重复使用这个字典中的之前的这个值。如下面的例子中,文件执行时(同一个代码块)会把 i1、i2 两个变量指向同一个对象,满足缓存机制则他们在内存中只存在一个,即:id 相同。
4 C3 l. }1 v6 z5 P* k- f9 B" N6 V' V; e. P+ t; S' W
- |$ P4 w6 d# B) G+ j/ v9 o3 G" s6 y
& } `+ T- q! X* o4 u$ H* ]* L' c+ U% g 8 o6 I6 v: I/ f" b
上面两张图分别为 Pycharm 中和 iPython 中对同一段代码的执行结果。可以看到在 Pycharm 中,代码以一个文件的形式来执行,i1 和 i2 指向了同一个对象;而在 iPython 中,i1 和 i2 是处于不同代码块中的,所以它们两个并不指向同一个对象
5 `( X- J+ r- [: O1 b- |) @
# _4 g$ d+ t$ a) M+ k; ]# v适用对象: int(float),str,bool
5 f' e9 R3 @ K# m% }+ T8 t$ \* w$ X2 m& Z9 N. G" t
对象的具体细则:9 u7 X% o' V% M& q. q
5 _8 z9 t* [5 B. O/ k4 W
int(float):任何数字在同一代码块下都会复用& h5 b2 } T. K' M: E: f) N# e
bool:True和False在字典中会以1,0方式存在,并且复用
$ c% R4 G$ |6 G' m( gstr:几乎所有的字符串都会符合缓存机制
- P0 Y. h. d, V. Q; q3 T+ i4 i非乘法得到的字符串都满足代码块的缓存机制
) u- q& T8 t& |) U2 V# }乘法得到的字符串
* L$ p5 v8 a5 I( Z/ @! ?乘数为1时,任何字符串满足代码块的缓存机制
) X0 ^! V4 O0 ?. y7 e, p3 b乘数>=2时:仅含大小写字母,数字,下划线,总长度<=20,满足代码块的缓存机制
% l/ l% L9 J! v* x优点: 能够提高一些字符串,整数处理人物在时间和空间上的性能;需要值相同的字符串,整数的时候,直接从‘字典’中取出复用,避免频繁的创建和销毁,提升效率,节约内存
: x) P3 k. l0 ~5 t& U2 l: L
8 Q* Z. ~6 F1 q( o) s 4 g5 e# y# G8 W& q; ?" ?
1 F( m0 }) A* _& |0 U
三、小数据池
* s" T$ X% L& I. v前提条件: 不同代码块内。
8 c; U* k4 e+ _; x0 j$ |, X. L4 g9 X( \! R8 q& ^' c
适用的对象: int bool str
' X+ B! z2 K8 A1 q/ X
2 ~" H8 @2 P" U0 \具体细则:0 Y5 [7 X: y2 E" t: ?
% M; a( Q2 r. b( Y. T1 W
int(float):-5~2568 l* `5 \$ H, o3 l' Q( E n# v
bool:True和False在字典中会以1,0方式存在,并且复用
0 N) _; T9 _/ }8 K6 Xstr:满足规则的字符串
, z* k+ S1 ~5 q0 C* W" z* `字符串的长度为0或者1,默认都采用了驻留机制(小数据池)& A, T" g! G; _# Y
![]()
: v+ E3 M5 X2 I) D# J字符串的长度>1,且只含有大小写字母,数字,下划线时,才会默认驻留8 L9 X0 L3 w4 d3 i2 H
![]()
& K+ J, O+ S, v用乘法得到的字符串
5 o, ~3 i5 P w乘数为1时,仅含大小写字母,数字,下划线;其他字符长度<=1,默认驻留( F5 Y- M! S' r2 ]* }3 j8 ?4 k
![]()
5 R5 I1 }3 z9 g' y乘数>=2时:仅含大小写字母,数字,下划线,总长度<=20,满足代码块的缓存机制
1 Z2 {" _2 R: m![]()
( `- [4 ~. R0 M8 r# F; r6 |( E. U7 ~5 ?4 {1 ]8 Y9 E1 ?7 ]
3 W8 P3 c. ~3 N1 z
四、总结( J: P* p, W h# m) V
判断两个对象是否是同一个用 is,判断两个对象的值是否相等用 ==7 ]+ ]' o% K6 [: \6 D9 S
同一个代码块下适用一个缓存机制;不同代码块下适用另一个缓存机制(小数据池)
2 E0 r+ z( h: {0 a" ?5 P$ b————————————————
/ X' b* N2 j2 N1 F0 x4 l( p) F版权声明:本文为CSDN博主「阿玮d博客」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
% \. Q2 z8 g1 H6 ^( w: T3 e原文链接:https://blog.csdn.net/weixin_42511320/article/details/105650842
# H# a, k8 ~1 D/ l7 M2 a! I) l& Y: A* p) |/ |% ?6 p
' @6 n7 \0 Y8 i1 h# f4 b" b |
zan
|