- 在线时间
- 661 小时
- 最后登录
- 2023-8-1
- 注册时间
- 2017-5-2
- 听众数
- 32
- 收听数
- 1
- 能力
- 10 分
- 体力
- 55572 点
- 威望
- 51 点
- 阅读权限
- 255
- 积分
- 17623
- 相册
- 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,==5 T/ c/ ?! q1 X4 X/ `1 Z- Z) n9 r
Python中一切皆对象。对象包含三个要素,id、type、value。
: b/ `3 q { g- V& D
- b6 d% C( y' Q# t' D' {id 是对象的内存地址。每当我们创建一个对象的时候都会在内存中开辟一块空间,将这个对象的数据临时存放到内存中,id就是这个空间的唯一标号,就好比身份证号。
" ]1 {% F* `% H) u( K N7 m0 L5 q7 _7 _( m
type 是对象的数据类型。包括 int(包括long)、float、string、list、tuple、dict、bool和NoneType 等。2 t0 F$ f, _1 Q8 z* Y7 g. f
/ }7 _" J: D0 Q; F! p; W0 w
value 是对象指向的内存地址中存放的具体的值。; U7 z @+ N2 b& _. ^/ ]
& U) @8 T( j- d
因为在对象具有这些要素,所以我们用 is 和 == 两个表达式来判断两个对象是否”相等“4 R0 D4 C Z% c2 U) ?+ T$ b; x
' S1 g6 B$ y) A# Mis 用于比较两个对象的地址(也就是 id)是否相同,而 == 用于比较两个对象引用的值是否相同5 z3 ]% O& U4 K7 o4 U, L3 H- \3 Q
![]()
m3 |' l$ q0 s" ? ]3 B% |% L( @7 \- E+ X) h d
我们也可以用身份证来理解:每个人都相当于一个对象,而身份证号(id)就唯一标识了世界上的每一个人;可能会存在姓名(value)相同(譬如两个人都叫阿玮),而身份证号不同的两个人。所以说如果内存地址相同,那么值肯定相同;但是如果值相同,内存地址不一定相同。$ {4 ^" j: F% S: j" q- L+ y- ]
! U# _( }8 F% b p8 G( ?二、代码块
+ p2 ]6 x/ S' S" U9 u4 X! [& OPython程序是由代码块构造的。块是一个 Python 程序的文本,他是作为一个单元执行的; R' r0 C* _, f, @' @) t( W
; C. e9 I# H- C, X代码块:一个模块,一个函数,一个类,一个文件等都是一个代码块
) n8 W) n7 F# _, ?, D1 u: Y7 ?% {
而作为交互方式输入的每个命令都是一个代码块(如在 iPython)环境中,如:
' R- l1 g, H. N![]()
- V- c3 L2 {( `5 z2 ^
8 d( F$ ]" Q' S; w' Y5 {6 _而对于同一个文件中的两个函数,也属于两个分别的代码块:) V. J" B$ _1 r: s8 K& Q
+ \0 Y0 D. ?1 G5 q 0 S8 I- M7 w- H2 a- U$ `9 h4 ` k
代码块的缓存机制* |; B6 s. E n) U6 o
前提条件: 同一代码块
) m( X/ }" O; c+ y/ T7 c) p; ?7 v$ J" J* G
机制内容: Python在执行同一个代码块的初始化对象的命令时,会检查是否其值是否已经存在,如果存在,会将其重用。换句话说:执行同一个代码块时,遇到初始化对象的命令时,他会将初始化的这个变量与值存储在一个字典中,在遇到新的变量时,会先在字典中查询记录,如果有同样的记录那么它会重复使用这个字典中的之前的这个值。如下面的例子中,文件执行时(同一个代码块)会把 i1、i2 两个变量指向同一个对象,满足缓存机制则他们在内存中只存在一个,即:id 相同。: q& R: {5 ?. R3 t9 J u# _$ A" f
, i0 D9 A/ {1 W3 k9 I, ^
![]()
8 t- k% y1 Z! U
' D9 _, k, ?$ q ) M! d0 D: z3 t) g
上面两张图分别为 Pycharm 中和 iPython 中对同一段代码的执行结果。可以看到在 Pycharm 中,代码以一个文件的形式来执行,i1 和 i2 指向了同一个对象;而在 iPython 中,i1 和 i2 是处于不同代码块中的,所以它们两个并不指向同一个对象2 s- p$ ~" s! C) Q
8 G1 l4 L) E8 M, F# F5 ^8 A
适用对象: int(float),str,bool! O" a" M, A8 q
0 \; ]+ @6 a" t3 D+ B9 q
对象的具体细则:
% P/ m9 A `) t; w6 p) j
$ q6 e! i" ^" z3 p1 gint(float):任何数字在同一代码块下都会复用
8 t% Y: O$ h1 ]$ Z1 n7 X+ t! n- Qbool:True和False在字典中会以1,0方式存在,并且复用1 s! a7 S# F* ^
str:几乎所有的字符串都会符合缓存机制$ L+ J; v, Y8 [/ @
非乘法得到的字符串都满足代码块的缓存机制8 P# G z p1 M' @5 E+ k
乘法得到的字符串8 K7 v* }! w% R) [0 G1 o7 P! J/ G( ?
乘数为1时,任何字符串满足代码块的缓存机制
( O8 T* k u: O3 V; t乘数>=2时:仅含大小写字母,数字,下划线,总长度<=20,满足代码块的缓存机制
0 w3 G o0 f+ }) F. R- }优点: 能够提高一些字符串,整数处理人物在时间和空间上的性能;需要值相同的字符串,整数的时候,直接从‘字典’中取出复用,避免频繁的创建和销毁,提升效率,节约内存/ Q2 r6 x% W! V( o: T. O- ^
' |6 f& x8 i, t! J* l
![]()
( ?) `, {$ J" y2 @5 W* j. ]( K( j& u
. P: @. w( ] }7 w* C: z三、小数据池9 V0 i% {+ z' X n1 G- I' X% s
前提条件: 不同代码块内。 [' X6 U& ?( J: v
3 r+ P3 b( i) k. m9 w) N
适用的对象: int bool str
$ Q* Q( }( M: d/ y, P' d; D/ r K! G5 f( A$ l4 a+ u" O
具体细则:
9 `; K, \5 w% B, W! m9 c4 d" O
int(float):-5~256
! X2 J0 W s/ W+ b- [& D* ebool:True和False在字典中会以1,0方式存在,并且复用* P. g9 D. r* b) T$ i; U% C9 G! M+ e
str:满足规则的字符串
# Y0 f) F; c- g; Y( `( i字符串的长度为0或者1,默认都采用了驻留机制(小数据池)4 k! g- a( p k, c& X0 Q
![]()
5 q% z( {$ J$ ?( d5 h8 p字符串的长度>1,且只含有大小写字母,数字,下划线时,才会默认驻留
) \0 P, V& c* Y' a$ m % n2 l5 w! m s- P b
用乘法得到的字符串* E+ L9 I* Q$ q
乘数为1时,仅含大小写字母,数字,下划线;其他字符长度<=1,默认驻留
8 `+ ] C- Z0 m& _# k! H, e * z6 D7 u a3 z& L$ K
乘数>=2时:仅含大小写字母,数字,下划线,总长度<=20,满足代码块的缓存机制
: d1 d9 i( f+ w0 `/ S; |# } 5 \2 e! n" Q* T8 C
* ?) n4 M# i3 z- | " h7 U' O7 M7 }
四、总结& K2 P0 q! k% c! y
判断两个对象是否是同一个用 is,判断两个对象的值是否相等用 ==6 g, G% ?/ f; X/ P, ^( X6 A) M
同一个代码块下适用一个缓存机制;不同代码块下适用另一个缓存机制(小数据池)$ a* }& \( R6 i
————————————————3 ]# }' c: F) r% b! p9 J3 @
版权声明:本文为CSDN博主「阿玮d博客」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。+ A- S3 W0 \4 q# |! ]! L( h E5 H
原文链接:https://blog.csdn.net/weixin_42511320/article/details/105650842
& U ]5 Z$ X; G: t1 i- c! T) u; _
9 u3 j/ q1 o: q c2 k1 Q. x( G7 y6 t, r" Y2 D4 R: }% E- } u
|
zan
|