- 在线时间
- 661 小时
- 最后登录
- 2023-8-1
- 注册时间
- 2017-5-2
- 听众数
- 32
- 收听数
- 1
- 能力
- 10 分
- 体力
- 55544 点
- 威望
- 51 点
- 阅读权限
- 255
- 积分
- 17615
- 相册
- 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,==
: Q( C! M5 X5 z$ f' `$ Q* JPython中一切皆对象。对象包含三个要素,id、type、value。8 b4 X) b( Q: R" e
6 {4 y) z. Y4 `/ G7 c- @$ Bid 是对象的内存地址。每当我们创建一个对象的时候都会在内存中开辟一块空间,将这个对象的数据临时存放到内存中,id就是这个空间的唯一标号,就好比身份证号。; @: \% O& l L# b4 Z, d2 d
1 b M9 r- A& N$ }0 D4 n+ Wtype 是对象的数据类型。包括 int(包括long)、float、string、list、tuple、dict、bool和NoneType 等。+ E: I' p# o) i+ U, i6 s
" [" f, }: A$ K- u/ ivalue 是对象指向的内存地址中存放的具体的值。
- V: G! N1 E% E# P" s) l! D( h8 I% Q6 \: r* g
因为在对象具有这些要素,所以我们用 is 和 == 两个表达式来判断两个对象是否”相等“
: E; e! M" x5 E6 U; a# }; j8 X% P$ |: ~& \+ C( X
is 用于比较两个对象的地址(也就是 id)是否相同,而 == 用于比较两个对象引用的值是否相同
* `) d: c9 E% L8 T' T* r6 M% h![]()
, R2 d# K, g3 \# `) P: Q6 s- _$ h$ i7 j: T } S
我们也可以用身份证来理解:每个人都相当于一个对象,而身份证号(id)就唯一标识了世界上的每一个人;可能会存在姓名(value)相同(譬如两个人都叫阿玮),而身份证号不同的两个人。所以说如果内存地址相同,那么值肯定相同;但是如果值相同,内存地址不一定相同。
9 @1 r! \; K) D$ U+ j! m
& d7 W# ~: @% B7 v* y2 a二、代码块
4 P) G( k+ r6 z* ~. c! kPython程序是由代码块构造的。块是一个 Python 程序的文本,他是作为一个单元执行的/ K3 h R8 E% o! z# M
/ {: p- H/ ^" z. U& b% a2 P
代码块:一个模块,一个函数,一个类,一个文件等都是一个代码块
& A" t) B' R. y X7 j, F' v" y* E
# Z+ X7 f6 k/ y$ k g5 Z! ^2 T. G而作为交互方式输入的每个命令都是一个代码块(如在 iPython)环境中,如:
- e' W/ f+ n2 h+ I! e* G % ] n( k) Q) v+ K. G) m$ `
* {& E* N2 Z" s( K0 L8 p, i' X而对于同一个文件中的两个函数,也属于两个分别的代码块:, w" n3 b, Z. E8 i O: I* O
) J1 K3 A; n# V0 o% k# i0 @ 0 I/ ]+ |$ g# F0 E
代码块的缓存机制( f. f# p$ X" Z4 H
前提条件: 同一代码块
8 r# r, k! k1 q# s: ~: f$ a' I+ }$ Z9 N
机制内容: Python在执行同一个代码块的初始化对象的命令时,会检查是否其值是否已经存在,如果存在,会将其重用。换句话说:执行同一个代码块时,遇到初始化对象的命令时,他会将初始化的这个变量与值存储在一个字典中,在遇到新的变量时,会先在字典中查询记录,如果有同样的记录那么它会重复使用这个字典中的之前的这个值。如下面的例子中,文件执行时(同一个代码块)会把 i1、i2 两个变量指向同一个对象,满足缓存机制则他们在内存中只存在一个,即:id 相同。
- y7 Z5 K# ]! y# O( G7 T9 h; O7 k7 R4 H2 [
& M% J, o# n4 F+ Y" G- v1 M
5 }& T- {' b9 p' s/ t; H5 J& [' ? . C5 d0 ]" c0 n* ^; L5 D9 w7 t
上面两张图分别为 Pycharm 中和 iPython 中对同一段代码的执行结果。可以看到在 Pycharm 中,代码以一个文件的形式来执行,i1 和 i2 指向了同一个对象;而在 iPython 中,i1 和 i2 是处于不同代码块中的,所以它们两个并不指向同一个对象
s/ U4 v/ M/ C* O# _/ y* i; ^3 l5 _& f. [9 O2 R: d
适用对象: int(float),str,bool
) g" G% Q3 x+ \- }4 \* E+ k! c0 D9 j2 h# U6 M! z) c
对象的具体细则:
% B; P1 K5 V8 q' Q# i+ `" k+ o
( z2 F2 F/ G0 V- S: D% fint(float):任何数字在同一代码块下都会复用
: u) H# s# A9 a" a. r' jbool:True和False在字典中会以1,0方式存在,并且复用/ ^4 F; o7 Q! o! }
str:几乎所有的字符串都会符合缓存机制. G6 o: L9 v, W4 D. {+ U8 }/ {4 n
非乘法得到的字符串都满足代码块的缓存机制- c, r1 {( p. H% C& f
乘法得到的字符串- B( B5 v) e5 X
乘数为1时,任何字符串满足代码块的缓存机制7 H7 t# \) [5 `$ b
乘数>=2时:仅含大小写字母,数字,下划线,总长度<=20,满足代码块的缓存机制
% _9 I9 |) V1 \# b' x优点: 能够提高一些字符串,整数处理人物在时间和空间上的性能;需要值相同的字符串,整数的时候,直接从‘字典’中取出复用,避免频繁的创建和销毁,提升效率,节约内存
- u" ^. t; N) X, e7 s1 o
, P$ v+ u V% n q a* _3 Q7 e![]()
: A1 X8 M2 f0 w) k* a$ a9 V
5 c; ^- Q: Y# w i! M o9 w$ L三、小数据池
( s7 j( `. O2 p; g- F# s前提条件: 不同代码块内。
W3 K5 t S* N% k9 k9 ^
0 V" M5 W' E) n3 n6 n5 _适用的对象: int bool str
: v a \$ p2 B; p# P; z; [: J0 ~- a) v
具体细则:
: U6 J. i* Q; _5 H2 b( r
# G" f" P4 q4 `" [4 v2 y' tint(float):-5~256
5 p+ d0 s3 ]' J, ~9 T( Bbool:True和False在字典中会以1,0方式存在,并且复用 g8 l8 q! S6 v" S3 ?
str:满足规则的字符串
* g5 g [6 \+ l" e7 a, @字符串的长度为0或者1,默认都采用了驻留机制(小数据池)
9 K% k2 }. M) ]3 i( {% I![]()
! k3 G) m% e( s" n# t( [2 p字符串的长度>1,且只含有大小写字母,数字,下划线时,才会默认驻留
3 H2 ?9 w+ I6 u( O2 e & q4 k0 k5 G' Y: K: l" ]
用乘法得到的字符串
9 m( F& W* ~7 s乘数为1时,仅含大小写字母,数字,下划线;其他字符长度<=1,默认驻留. x: g$ o8 w C
& t, X, ?% q: `! B
乘数>=2时:仅含大小写字母,数字,下划线,总长度<=20,满足代码块的缓存机制
* Z. V- c9 r# L+ K. O9 ?![]()
8 @+ V- ?# B2 p( n0 }/ A7 f1 ~
* d* T8 H% k& E- X4 L' o 8 W5 }1 d& j# y- G' K r
四、总结* q$ u! V( @4 [$ ~! ~# _; D6 }
判断两个对象是否是同一个用 is,判断两个对象的值是否相等用 ==
, H$ E$ h, ]) j& }- n/ ~同一个代码块下适用一个缓存机制;不同代码块下适用另一个缓存机制(小数据池)
: l+ u. _# Q! t; r0 S4 N" [2 B) ?————————————————
9 }9 ]' _) M8 |版权声明:本文为CSDN博主「阿玮d博客」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。2 T# o/ s) Z% \4 h7 f9 Z' y
原文链接:https://blog.csdn.net/weixin_42511320/article/details/105650842! }% |" W+ R$ y5 r2 N
3 m5 C( e( R$ x0 r6 y
: S4 ^) T( r# e4 |8 C |
zan
|