/ h8 x5 ~' \# d) O' R8 Z. n" f) Y1 ] " O, E5 H6 o2 W7 c我们也可以用身份证来理解:每个人都相当于一个对象,而身份证号(id)就唯一标识了世界上的每一个人;可能会存在姓名(value)相同(譬如两个人都叫阿玮),而身份证号不同的两个人。所以说如果内存地址相同,那么值肯定相同;但是如果值相同,内存地址不一定相同。9 Y, n/ M; y: Q
8 H9 K$ h0 F: a9 d# S2 U8 h二、代码块" Z/ e4 |% i7 W* ~' X3 [2 _" ]
Python程序是由代码块构造的。块是一个 Python 程序的文本,他是作为一个单元执行的 / E, \, g+ s4 J7 l * V0 j* G0 S4 e$ s. a; @7 u2 k代码块:一个模块,一个函数,一个类,一个文件等都是一个代码块 0 r8 o! g8 I0 I& N3 U8 ^! G ( S& B# D7 u6 e f, r而作为交互方式输入的每个命令都是一个代码块(如在 iPython)环境中,如:; [, W/ Y% ~, L# M! e
& R- N' s. u2 p6 V8 S; t1 c, B G0 ~3 K2 o; Z; e
而对于同一个文件中的两个函数,也属于两个分别的代码块:) A6 |) i$ g& z# E) Z- w, n0 G
* ^& ^9 t5 |5 d/ b8 X7 A8 G 5 z9 K# v Z. o8 z$ U代码块的缓存机制 H. J7 ^ j- B
前提条件: 同一代码块 1 L o7 K$ _3 G1 O: w- G9 O: w: s% x2 G7 }1 V3 `3 i
机制内容: Python在执行同一个代码块的初始化对象的命令时,会检查是否其值是否已经存在,如果存在,会将其重用。换句话说:执行同一个代码块时,遇到初始化对象的命令时,他会将初始化的这个变量与值存储在一个字典中,在遇到新的变量时,会先在字典中查询记录,如果有同样的记录那么它会重复使用这个字典中的之前的这个值。如下面的例子中,文件执行时(同一个代码块)会把 i1、i2 两个变量指向同一个对象,满足缓存机制则他们在内存中只存在一个,即:id 相同。 ) a5 o' o1 J* W # R Q) g5 W8 V 4 N; t4 o1 d6 m, c/ f) [/ h3 f; j 6 q; ^9 D# q8 M7 u ( b( n, D- e' x. t( d% Q( `( k# n- n上面两张图分别为 Pycharm 中和 iPython 中对同一段代码的执行结果。可以看到在 Pycharm 中,代码以一个文件的形式来执行,i1 和 i2 指向了同一个对象;而在 iPython 中,i1 和 i2 是处于不同代码块中的,所以它们两个并不指向同一个对象 2 S% D! S) a! Z" c) r9 _! U' R/ A4 {. Y& H: a
适用对象: int(float),str,bool : @! w7 h0 z/ | {' }# e: J0 g. x% h4 Z, y! D" g
对象的具体细则: 2 V+ ~, O6 O5 i ! A5 i, @+ n% J8 u6 ?int(float):任何数字在同一代码块下都会复用 9 O2 \" ~" z2 K% Z2 r) ^/ {bool:True和False在字典中会以1,0方式存在,并且复用 9 b A+ m- U$ U8 f8 N8 J4 qstr:几乎所有的字符串都会符合缓存机制; b! ^9 S1 V8 j
非乘法得到的字符串都满足代码块的缓存机制 , e w9 c/ k; W$ o: F, p/ f乘法得到的字符串 , m9 R; h! c2 s$ t+ B* N; Q乘数为1时,任何字符串满足代码块的缓存机制) j, s. d9 X3 ~; D4 ^
乘数>=2时:仅含大小写字母,数字,下划线,总长度<=20,满足代码块的缓存机制$ s. y. @& B8 n0 D1 V4 E$ i
优点: 能够提高一些字符串,整数处理人物在时间和空间上的性能;需要值相同的字符串,整数的时候,直接从‘字典’中取出复用,避免频繁的创建和销毁,提升效率,节约内存3 } w* @8 B3 l$ k; H, z
; D% T- A0 z n% `0 e" y3 V ! s7 B+ ?- e+ I) l4 H& h ) u! j" N/ A2 m, M3 M0 K三、小数据池 9 n0 ]: `8 C' n [前提条件: 不同代码块内。 3 D& [; |- R# O# v( Z0 m3 c) q$ t* Q; @3 M# b- e! F( `
适用的对象: int bool str. I' t5 I. t8 Z. k5 H
5 H8 e4 k- O/ D( H: v
具体细则: 3 e# Y- z. N9 |$ t O* G, ] ; k0 V0 ~9 z: iint(float):-5~256 4 O; K( W% {. E. K* y8 i xbool:True和False在字典中会以1,0方式存在,并且复用+ P1 J* c* K* W2 W9 N
str:满足规则的字符串 , o# P* T4 R: @# s' W字符串的长度为0或者1,默认都采用了驻留机制(小数据池)2 P P* y$ a: c, E4 \9 f/ Q