python is 和 ==

在写code的时候,读目录然后找出需要的文件名,我通过判断后缀来取出需要的文件

if allfile[i][-4:] is '.csv':   #allfile[i][-4:] = '.csv'
    csvfile.append(i) 
最后换成: 
if cmp(i[-4:],'.csv') == 0:
    csvfile.append(i)

我在这边打印了好多信息,然后判断是有值得,但就是两个不相等。最后用cmp函数解决了。现在来分析一下为什么!

python中对象包含三个基本要素:id(内存地址)、type(数据类型)、value(值)

 ==是用来判断对象的value是否相等

 is 是同一性运算符,比较判断的是id是否相同。

然后了解了以下python 的intern机制:

    通过一个字符串储蓄池,这个池子是一个字典结构,如果字符串已经存在池子中就不再创建新的字符串,直接返回创建好的字符串对象,如果之前还没有加入到池子中,则先创建一个字符串对象,并把这个对象加入到池子里,方便下一次获取。


为啥会有intern机制:提高效率和解决空间,

找到一个网页    https://mrcuriosity.org/python-string-intern.html  上面分析了一波源代码,我记住的就是字符串包括

,这些组成的字符串可以使用is

不过,这是有长度的限制。256个字符串,第257个字符串会是不同的变量名。

不过可以使用intern()这个函数  比如a = intern('.csv')  b = intern('.csv')   a is b   ->true



为了优化速度,python使用了小整数对象池,避免为整数频繁申请和销毁内存空间,小整数定义[-5,256],只要这个数字在这个范围类,无论这个整数处于LEGB中的哪个位置, 内存地址是一样的。

LEGB    : locals ->enclosing function ->globals ->__builtins__

locals: 函数内的名字空间,包含局部变量和形参

enclosing :外部嵌套函数的名字空间

globals :全局变量,函数定义所在模块的名字空间

builtins:内置模块的名字空间。




阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页