- 在线时间
- 661 小时
- 最后登录
- 2023-8-1
- 注册时间
- 2017-5-2
- 听众数
- 32
- 收听数
- 1
- 能力
- 10 分
- 体力
- 55556 点
- 威望
- 51 点
- 阅读权限
- 255
- 积分
- 17618
- 相册
- 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,==+ e/ ]1 Z2 h$ @- r$ n6 t
Python中一切皆对象。对象包含三个要素,id、type、value。
" X) a7 S: _. i# V
7 H5 X! u, [' ^3 _% xid 是对象的内存地址。每当我们创建一个对象的时候都会在内存中开辟一块空间,将这个对象的数据临时存放到内存中,id就是这个空间的唯一标号,就好比身份证号。6 _! _. J( R* n7 T q+ {& L; J3 Q
7 {. t1 i( @4 dtype 是对象的数据类型。包括 int(包括long)、float、string、list、tuple、dict、bool和NoneType 等。
; A- w8 K! ?. {4 w8 n" d* R4 k5 Z/ N# K9 j
value 是对象指向的内存地址中存放的具体的值。5 B6 L6 }8 \6 G2 v0 d0 y
7 W3 y% `0 G* X因为在对象具有这些要素,所以我们用 is 和 == 两个表达式来判断两个对象是否”相等“4 r% \0 G" m. `5 }$ J0 E0 O
2 y4 K& M2 N t
is 用于比较两个对象的地址(也就是 id)是否相同,而 == 用于比较两个对象引用的值是否相同: Z; n2 }& s; ]" w: ]5 F: A" V
) G. Y* h) [: V, m5 T
. @) F4 E. J: [% F9 j5 `
我们也可以用身份证来理解:每个人都相当于一个对象,而身份证号(id)就唯一标识了世界上的每一个人;可能会存在姓名(value)相同(譬如两个人都叫阿玮),而身份证号不同的两个人。所以说如果内存地址相同,那么值肯定相同;但是如果值相同,内存地址不一定相同。* r/ u1 c4 ]. n- x
/ M! n) D( \$ l
二、代码块. b/ T9 F3 r, L. A* M+ \
Python程序是由代码块构造的。块是一个 Python 程序的文本,他是作为一个单元执行的1 v$ H( D. S, \. L' D- i. l
0 p! ~* I7 r* @9 p$ D
代码块:一个模块,一个函数,一个类,一个文件等都是一个代码块
0 U C) K5 W/ K8 C3 {" ?7 z
3 b7 I2 t. Z0 I" f. a. S! ]而作为交互方式输入的每个命令都是一个代码块(如在 iPython)环境中,如:
; N* b; E( C9 [5 f: f/ r0 G 2 B% c% G! J, o( d1 L
; {+ c& `" U1 p; M# x
而对于同一个文件中的两个函数,也属于两个分别的代码块:
; @; p5 b( z) G2 {, P: P, `) K
8 i: w& U* G' Z# n% o3 N3 `. b $ J4 ?0 c1 s' d
代码块的缓存机制
5 m/ H) ]" P* M* Q9 u1 c, b0 g前提条件: 同一代码块
, S, |$ M/ \4 @8 o# `, X r' R: b6 e- w* B8 Q5 p, J# o1 b
机制内容: Python在执行同一个代码块的初始化对象的命令时,会检查是否其值是否已经存在,如果存在,会将其重用。换句话说:执行同一个代码块时,遇到初始化对象的命令时,他会将初始化的这个变量与值存储在一个字典中,在遇到新的变量时,会先在字典中查询记录,如果有同样的记录那么它会重复使用这个字典中的之前的这个值。如下面的例子中,文件执行时(同一个代码块)会把 i1、i2 两个变量指向同一个对象,满足缓存机制则他们在内存中只存在一个,即:id 相同。" V7 S, J# [% i H
: {: _3 x% l- o s5 d, G 6 g0 F. B) [4 ^% j( E* r
, O' @& s( X" M9 K2 i0 U$ W1 K6 a / B3 U" z& h3 a, f$ g% o8 S
上面两张图分别为 Pycharm 中和 iPython 中对同一段代码的执行结果。可以看到在 Pycharm 中,代码以一个文件的形式来执行,i1 和 i2 指向了同一个对象;而在 iPython 中,i1 和 i2 是处于不同代码块中的,所以它们两个并不指向同一个对象
0 [+ I$ ~, A* ~& O( K4 J% t @, ]! j" E ]) u
适用对象: int(float),str,bool S2 p, u1 U' V" ~
0 R/ F: w. G4 c2 \& V对象的具体细则:4 f+ y4 `* j' d
& p% c- h `3 eint(float):任何数字在同一代码块下都会复用) `$ Y8 _- o) P. @
bool:True和False在字典中会以1,0方式存在,并且复用& B0 O; [5 @7 h% h, U4 Z8 F7 d7 C* ~ p. e
str:几乎所有的字符串都会符合缓存机制
5 D3 \' i; F# @7 i* u* o# D/ ~; B: n非乘法得到的字符串都满足代码块的缓存机制+ _ r9 h$ P& \7 z
乘法得到的字符串8 U H5 q( f, m% |
乘数为1时,任何字符串满足代码块的缓存机制 }" i% _4 y* q6 c0 y' j
乘数>=2时:仅含大小写字母,数字,下划线,总长度<=20,满足代码块的缓存机制9 v$ R1 P1 Z3 D4 X
优点: 能够提高一些字符串,整数处理人物在时间和空间上的性能;需要值相同的字符串,整数的时候,直接从‘字典’中取出复用,避免频繁的创建和销毁,提升效率,节约内存
% ?7 n3 ^. Z; R, z7 N: C3 L
$ I' y$ w: P, K3 J9 q 0 R( z. F" o& Q
+ C& s2 U. d8 Z+ }0 L三、小数据池
: a+ `" ~8 h6 u前提条件: 不同代码块内。8 q% F0 t& y, K
* q2 I) W, B& G6 }, c
适用的对象: int bool str! P0 F: m2 F9 y) D# T+ W
3 ^& M5 J7 ~! D3 V0 @$ n
具体细则:8 Q# w$ [$ G! f* F8 t6 V
9 x/ w, `6 D# `$ Hint(float):-5~256# `8 f0 i! R; S( }: m0 m( V
bool:True和False在字典中会以1,0方式存在,并且复用 ^6 A1 o+ z' Q# I
str:满足规则的字符串
+ }) M: q- s# u) }* y- x字符串的长度为0或者1,默认都采用了驻留机制(小数据池)
* Z" p1 Q* K2 Y7 P, E![]()
2 a9 q9 @2 _$ ] ^, v% c! G/ ^' p* c! ]字符串的长度>1,且只含有大小写字母,数字,下划线时,才会默认驻留 h% y0 ?. j# s( o9 p
: b7 a3 p* w+ `# `2 N$ ?* P
用乘法得到的字符串
# [2 r! Z% p( B乘数为1时,仅含大小写字母,数字,下划线;其他字符长度<=1,默认驻留
& D) o. N% _1 C I+ Y3 N" z![]()
+ }5 q/ o4 y4 L. ?) H- i乘数>=2时:仅含大小写字母,数字,下划线,总长度<=20,满足代码块的缓存机制
1 ?7 W7 d# s) r% L4 @![]()
- m4 f% j2 F& H$ m6 ], G: A% z
% m) Q! i- o/ w![]()
9 q1 Q; T" t: q. [四、总结9 N4 M. c; |5 _& y4 k2 u
判断两个对象是否是同一个用 is,判断两个对象的值是否相等用 ==9 x8 j' o* Q3 z
同一个代码块下适用一个缓存机制;不同代码块下适用另一个缓存机制(小数据池)
: f$ c E; V. p# Z————————————————% J4 L' A/ r3 b, w* K" v
版权声明:本文为CSDN博主「阿玮d博客」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。$ b b, y6 }' ^& S; ?
原文链接:https://blog.csdn.net/weixin_42511320/article/details/105650842! _5 F' u5 s" a4 z
; s; v5 Z S. j8 e+ T a4 C* L4 x3 T# @# T, O& x8 h
|
zan
|