- 在线时间
- 661 小时
- 最后登录
- 2023-8-1
- 注册时间
- 2017-5-2
- 听众数
- 32
- 收听数
- 1
- 能力
- 10 分
- 体力
- 55510 点
- 威望
- 51 点
- 阅读权限
- 255
- 积分
- 17604
- 相册
- 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,==
; u+ c" G; S! _7 z) s; Q+ VPython中一切皆对象。对象包含三个要素,id、type、value。
* w6 ]/ j6 |. V8 b
0 \* _9 v4 O: i( Wid 是对象的内存地址。每当我们创建一个对象的时候都会在内存中开辟一块空间,将这个对象的数据临时存放到内存中,id就是这个空间的唯一标号,就好比身份证号。3 b6 l& w7 I. o) ?) K, m' D
) G; N0 ]# n* T/ I/ {
type 是对象的数据类型。包括 int(包括long)、float、string、list、tuple、dict、bool和NoneType 等。
- Y0 ?/ V; n" ]7 s! u# E: i. u' A- b
value 是对象指向的内存地址中存放的具体的值。
% l2 K: _# \( Y( g d4 B4 Y8 d- X5 l) w; U4 O1 J0 x
因为在对象具有这些要素,所以我们用 is 和 == 两个表达式来判断两个对象是否”相等“- O1 h( `/ ?) U) b/ ^
3 o! A0 X$ m4 c6 W: Iis 用于比较两个对象的地址(也就是 id)是否相同,而 == 用于比较两个对象引用的值是否相同
0 m4 H+ \+ l1 h7 D; Z7 I , `8 V' d" A8 ?- T: V" Z
; e4 Y4 g' X. F" p& |/ U我们也可以用身份证来理解:每个人都相当于一个对象,而身份证号(id)就唯一标识了世界上的每一个人;可能会存在姓名(value)相同(譬如两个人都叫阿玮),而身份证号不同的两个人。所以说如果内存地址相同,那么值肯定相同;但是如果值相同,内存地址不一定相同。: G# T5 c! e8 [/ P! O
' i- C/ m0 S- e l二、代码块$ b6 s) H! {1 y
Python程序是由代码块构造的。块是一个 Python 程序的文本,他是作为一个单元执行的7 K2 w( i: z% g! N+ S9 [% H' ~$ N
" e$ J/ r: v$ d& [+ r) P
代码块:一个模块,一个函数,一个类,一个文件等都是一个代码块1 ^) U a' U5 T. \, H
# j& j( c+ R" f
而作为交互方式输入的每个命令都是一个代码块(如在 iPython)环境中,如:
7 x: O+ _+ O( C" k, N 7 D% ~# ?! o6 j" M
+ J( Q. j5 C2 s( C3 @ O# ?而对于同一个文件中的两个函数,也属于两个分别的代码块:- ?) g% g2 O' t: S% L
: C4 M9 b9 h" | ^+ ^! t( S
, A2 r; |- w0 C
代码块的缓存机制
# j1 _7 U( s8 P- U: t1 U8 N前提条件: 同一代码块
8 P2 _6 N2 A! B2 j+ n1 Z( T; D' m0 k0 ~. K3 U) B6 H$ i& g" z2 a( L+ w/ S
机制内容: Python在执行同一个代码块的初始化对象的命令时,会检查是否其值是否已经存在,如果存在,会将其重用。换句话说:执行同一个代码块时,遇到初始化对象的命令时,他会将初始化的这个变量与值存储在一个字典中,在遇到新的变量时,会先在字典中查询记录,如果有同样的记录那么它会重复使用这个字典中的之前的这个值。如下面的例子中,文件执行时(同一个代码块)会把 i1、i2 两个变量指向同一个对象,满足缓存机制则他们在内存中只存在一个,即:id 相同。
* ?* L7 h) S# M: {/ m! s% y1 S% o ^& h
![]()
e; G. Z) u% D5 T" |
. o) t2 P: L& {3 v. S![]()
9 S$ F9 \9 v* m F- l上面两张图分别为 Pycharm 中和 iPython 中对同一段代码的执行结果。可以看到在 Pycharm 中,代码以一个文件的形式来执行,i1 和 i2 指向了同一个对象;而在 iPython 中,i1 和 i2 是处于不同代码块中的,所以它们两个并不指向同一个对象
. N" K9 Y7 c: n- Z0 `* u
' V" L6 A! Z) p* G) V# q: @) ]适用对象: int(float),str,bool
, u: ?( B. m [! N- t7 S7 W" i+ W5 ^: K: o5 X, M" p
对象的具体细则:
8 E' ]( {. |+ f2 b& t0 m
% o: N: Q( g# @( Y& L& [int(float):任何数字在同一代码块下都会复用, |) l- b5 G4 n' A& S
bool:True和False在字典中会以1,0方式存在,并且复用
+ w8 i6 V9 x+ n9 M: `str:几乎所有的字符串都会符合缓存机制$ Q; _0 ]8 v5 M) a
非乘法得到的字符串都满足代码块的缓存机制
+ Z0 R7 ~. F6 [- C5 d% t/ L! j$ l乘法得到的字符串
3 B6 M' B0 D# ]; f9 X乘数为1时,任何字符串满足代码块的缓存机制5 ~5 U( q- S) E. E. I
乘数>=2时:仅含大小写字母,数字,下划线,总长度<=20,满足代码块的缓存机制$ _) K3 A( f) d' u9 x* }" g, Y/ S
优点: 能够提高一些字符串,整数处理人物在时间和空间上的性能;需要值相同的字符串,整数的时候,直接从‘字典’中取出复用,避免频繁的创建和销毁,提升效率,节约内存
6 t) z- x* D; T
. ], e8 q- r* R![]()
& F A) a7 Y7 A3 T% ~) C: q# A/ k, h) `8 D" ]
三、小数据池 A7 j$ }: N/ e
前提条件: 不同代码块内。 d, e: ~4 F& O, I. a# J' A
( ]3 n+ |1 b% I& w) c
适用的对象: int bool str
6 P# `8 b' j0 b3 ]7 I5 m/ P @% p/ Y$ H, m6 P( ^
具体细则:9 K% H4 F5 [6 f( X2 t" Y" _8 K
5 m( d* q/ ]8 p2 f. k
int(float):-5~256
- p- D- k- Y- n6 h7 Dbool:True和False在字典中会以1,0方式存在,并且复用
9 e8 @" _% t1 \" r" ostr:满足规则的字符串
5 q: N. {# ?( y. q$ Y4 R# i0 u字符串的长度为0或者1,默认都采用了驻留机制(小数据池)9 G& S( ` D$ |8 |2 f: m
' Z. l) a4 D- V
字符串的长度>1,且只含有大小写字母,数字,下划线时,才会默认驻留. O- ^8 r' a5 t3 Q* v& \- R1 F
& B+ d A+ c) W y
用乘法得到的字符串4 l0 s# J% O7 G6 S
乘数为1时,仅含大小写字母,数字,下划线;其他字符长度<=1,默认驻留
0 n7 d/ Q( z" ?4 m$ e; I* a 6 a% v6 a& U$ C2 D9 M3 F
乘数>=2时:仅含大小写字母,数字,下划线,总长度<=20,满足代码块的缓存机制
' k# A4 E) S$ U 3 K( R1 I6 Z( G3 P, Q9 }
" t$ _7 c' ]. ]: K( b ?# v, }& c2 H9 n4 l( m5 s5 m
四、总结% E) |+ s+ j U. [
判断两个对象是否是同一个用 is,判断两个对象的值是否相等用 ==
9 v: T2 A: }1 q) _同一个代码块下适用一个缓存机制;不同代码块下适用另一个缓存机制(小数据池)
, { n. K+ y1 X% v————————————————" v" {, N7 e! U/ F5 N2 E
版权声明:本文为CSDN博主「阿玮d博客」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
! J" v, ~5 e' g* s a+ I原文链接:https://blog.csdn.net/weixin_42511320/article/details/105650842
7 v8 E" N; b9 O, j4 Z
) N# s' i! S0 N' J# A7 D+ |: I e
|
zan
|