- 在线时间
- 661 小时
- 最后登录
- 2023-8-1
- 注册时间
- 2017-5-2
- 听众数
- 32
- 收听数
- 1
- 能力
- 10 分
- 体力
- 55580 点
- 威望
- 51 点
- 阅读权限
- 255
- 积分
- 17625
- 相册
- 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,== l6 k, W5 G, i2 l/ X, ?) R
Python中一切皆对象。对象包含三个要素,id、type、value。% L- `3 w/ L8 v/ m( j( b& D8 X7 Y
1 H0 ^+ F9 _+ K" y6 [, ~
id 是对象的内存地址。每当我们创建一个对象的时候都会在内存中开辟一块空间,将这个对象的数据临时存放到内存中,id就是这个空间的唯一标号,就好比身份证号。! e$ Q; C$ S2 ^# u* o% B/ N% `% r/ s/ Q
: Y7 |5 S, E' V
type 是对象的数据类型。包括 int(包括long)、float、string、list、tuple、dict、bool和NoneType 等。
; [: I' E: L6 c1 E0 b
; V% e( v! _# n2 fvalue 是对象指向的内存地址中存放的具体的值。
; \* o! V. }/ x" B5 G, q# l1 `0 g( [6 M
& L' f3 _, O/ O2 Y因为在对象具有这些要素,所以我们用 is 和 == 两个表达式来判断两个对象是否”相等“. U* k) m; i4 v$ T, q7 [7 @
' R: A* `) X% [6 ?is 用于比较两个对象的地址(也就是 id)是否相同,而 == 用于比较两个对象引用的值是否相同% E7 _% f9 ^( B' g3 R$ A( U- @
![]()
. @/ B; Z/ M% N( K4 X3 }0 u7 r. G9 J# o5 g1 i6 s& T- J1 i; D5 {* j+ X
我们也可以用身份证来理解:每个人都相当于一个对象,而身份证号(id)就唯一标识了世界上的每一个人;可能会存在姓名(value)相同(譬如两个人都叫阿玮),而身份证号不同的两个人。所以说如果内存地址相同,那么值肯定相同;但是如果值相同,内存地址不一定相同。/ v1 c8 b: i* k
& d5 E' w0 x0 Q! _0 C# d二、代码块
1 ?2 Y) ~/ H% A, p1 V9 lPython程序是由代码块构造的。块是一个 Python 程序的文本,他是作为一个单元执行的
' p- b8 E( `/ p. K* O X! o5 y+ C5 k1 q. v
代码块:一个模块,一个函数,一个类,一个文件等都是一个代码块, H( ~ T3 y3 f5 h% n' [# _; }) J
. [) k3 O _( ~: f# n- j) h而作为交互方式输入的每个命令都是一个代码块(如在 iPython)环境中,如:
. i* Z1 ^% s. N$ m( Z1 Y |1 ]![]()
. a# _2 ?* X/ S; g) y
1 P7 `) ] r& }$ E4 {而对于同一个文件中的两个函数,也属于两个分别的代码块:
' _4 g! u* _, f r7 l; S- D% p, G' z0 z0 d1 ^0 }2 P" f
- z* R/ z* `1 O: v: K8 v0 }) q% ]) l
代码块的缓存机制
. x$ | _8 \- @. Z前提条件: 同一代码块% w0 h0 I$ z- B" U7 s! }' m) ?
( s8 s: x8 q6 ]2 K' {6 N. I机制内容: Python在执行同一个代码块的初始化对象的命令时,会检查是否其值是否已经存在,如果存在,会将其重用。换句话说:执行同一个代码块时,遇到初始化对象的命令时,他会将初始化的这个变量与值存储在一个字典中,在遇到新的变量时,会先在字典中查询记录,如果有同样的记录那么它会重复使用这个字典中的之前的这个值。如下面的例子中,文件执行时(同一个代码块)会把 i1、i2 两个变量指向同一个对象,满足缓存机制则他们在内存中只存在一个,即:id 相同。
' p$ K5 U g1 s& h3 B1 q. f' Y$ X- c# f
![]()
" `( O+ m# J, \2 p/ \
: X/ M& f/ n3 i I" a7 \% l+ m6 B0 J
上面两张图分别为 Pycharm 中和 iPython 中对同一段代码的执行结果。可以看到在 Pycharm 中,代码以一个文件的形式来执行,i1 和 i2 指向了同一个对象;而在 iPython 中,i1 和 i2 是处于不同代码块中的,所以它们两个并不指向同一个对象$ P* S! ?, H: g$ P
3 J# N ~* T7 a4 t0 w, Q: o
适用对象: int(float),str,bool
. o7 a( t( O# l Z8 o0 l% L: F3 n1 r7 B' g0 m/ n# }2 B3 U
对象的具体细则:
9 ?% m( I6 t P; H; g
: `, A& M9 X+ E5 |! _* M, ?( I- cint(float):任何数字在同一代码块下都会复用
! P) l2 g6 M3 Qbool:True和False在字典中会以1,0方式存在,并且复用& j3 `& F. c5 C) R7 v# D5 f* a
str:几乎所有的字符串都会符合缓存机制+ Z% f5 P# u3 F/ J2 U
非乘法得到的字符串都满足代码块的缓存机制
) h: e8 D$ m/ ?- g1 f/ @乘法得到的字符串
2 K8 q( I! m7 Y: B5 I. T1 h乘数为1时,任何字符串满足代码块的缓存机制
& Y# R# `6 C1 B V) r B乘数>=2时:仅含大小写字母,数字,下划线,总长度<=20,满足代码块的缓存机制
$ ^7 F: q7 v& A优点: 能够提高一些字符串,整数处理人物在时间和空间上的性能;需要值相同的字符串,整数的时候,直接从‘字典’中取出复用,避免频繁的创建和销毁,提升效率,节约内存+ f. x7 t/ ~" ?7 R$ J
3 G5 g0 J2 q4 H$ q* U8 j+ f6 f2 f. y
![]()
( o. |2 K" U0 W. g5 u; Y1 U: [8 ]4 v& L) k- W. x- z, W
三、小数据池+ g1 v O4 A7 p- V& z0 ]. |+ E
前提条件: 不同代码块内。
' J* r! p/ o8 E6 @- v @! k
9 ?4 l+ S. X4 x: `+ A适用的对象: int bool str# C* z7 U- H6 p7 u" t
$ l3 o8 D: I: C0 }4 K具体细则:9 q" R* K3 ~$ c9 L" \) O% E q) {
. W/ {9 Y# P$ Wint(float):-5~256- Q' K7 Z* c0 _ ?( s
bool:True和False在字典中会以1,0方式存在,并且复用
- A! p% q: [) s" X# @5 n) H8 E! Ostr:满足规则的字符串
" L' @, U8 w$ M* x! c$ [字符串的长度为0或者1,默认都采用了驻留机制(小数据池)
! j- N2 N/ h5 e4 H3 A4 E% `0 I & z/ i5 ]& Y5 v/ }+ q
字符串的长度>1,且只含有大小写字母,数字,下划线时,才会默认驻留% i9 G# O, c2 G3 ]. I# l
e# G) G! g; E& a" \$ [
用乘法得到的字符串
! {6 m% k% D1 i7 Q乘数为1时,仅含大小写字母,数字,下划线;其他字符长度<=1,默认驻留2 B3 H: H# N. G k' Q- O- q& ~" R
; {8 ?4 n, }4 Q7 y5 |/ m
乘数>=2时:仅含大小写字母,数字,下划线,总长度<=20,满足代码块的缓存机制
! _: L* k( i1 W, ^5 j 3 u. s( C7 `# i6 c
+ B$ y/ W, E& I }, ]
![]()
) B7 E* Q8 @" U( i* O2 ^四、总结
- q5 a) |& U# H5 g) Z! z: ^ g0 c判断两个对象是否是同一个用 is,判断两个对象的值是否相等用 ==2 M r/ {7 c% I8 |5 \0 o6 l% X
同一个代码块下适用一个缓存机制;不同代码块下适用另一个缓存机制(小数据池)
) `: F! Q' `% ?, }; F: g( u———————————————— A5 P, f8 T8 {/ z `; C$ `* a
版权声明:本文为CSDN博主「阿玮d博客」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。0 n& O0 c! p3 @$ D7 M; O4 W
原文链接:https://blog.csdn.net/weixin_42511320/article/details/105650842
! {) B+ D6 T. S4 i. F% r3 D9 m. J1 V# p& T1 G: N/ e
7 Y3 R) S4 C4 `3 `/ @( [ |
zan
|