Python 零散知识点

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python 零散知识点相关的知识,希望对你有一定的参考价值。

Python 全局变量 global

Python 3 assert(断言)

 

Python is 与 == 区别

在 Python 中一切都是对象,对象之间比较是否相等可以用==,也可以用is。==和is操作的区别是:

is

比较的是两个对象的id值是否相等,也就是比较俩对象是否为同一个实例对象,是否指向同一个内存地址。

==

比较的是两个对象的内容是否相等,默认会调用对象的__eq__()方法。

 

使用is注意python关于字符串的intern机制存储
    注意python中创建两个内容一样的变量时(变量名不一样),一般都会在内存中分配两个内存地址分别给这两个变量。即两个变量的内容虽然样,但是变量的引用地址不一样。所以两个变量使用==比较成立,但是使用 is比较不成立。

但是在python中有两个意外情况:
1.使用python命令行时对于小整数[-5,256]区间内的整数,python会创建小整数对象池,这些对象一旦创建,就不会回收,所有新创建的在这个范围的整数都是直接引用他即可。所以造成在[-5,256]区间内的整数不同变量只要值相同,引用地址也相同。此范围外的整数同样遵循新建一个变量赋予一个地址。

2.python中虽然字符串对象也是不可变对象,但python有个intern机制,简单说就是维护一个字典,这个字典维护已经创建字符串(key)和它的字符串对象的地址(value),每次创建字符串对象都会和这个字典比较,没有就创建,重复了就用指针进行引用就可以了。相当于python对于字符串也是采用了对象池原理。(但是注意:如果字符串(含有空格),不可修改,没开启intern机制,不共用对象。比如"a b"和"a b",这种情况使用is不成立的形式 只有在命令行中可以。使用pycharm同样是True,因为做了优化)

 

 

Python3 中的nonlocal用法

count = 1

def a():
    count = \'a函数里面\'    #如果不事先声明,那么函数b中的nonlocal就会报错
    def b():
        nonlocal count
        print(count)
        count = 2
    b()
    print(count)

if __name__ == \'__main__\':
    a()
    print(count)

运行结果是:

a函数里面
2
1

 

python对象池


python中,一切皆为对象
id方法的返回值就是对象的内存地址。
is运算符,如果引用的是同一个对象则返回true,x is y类似 id(x) == id(y)

小整数对象池
[-5, 256] 这些小整数被定义在了一个整数对象池里,当引用小整数时会自动引用整数对象池里的对象,所以这些小整数不会重复创建,当多个变量指向同一个小整数时,实质上它们指向的是同一个对象。
字符串
字符串对象是不可变对象,python有个intern机制,简单说就是维护一个字典,这个字典维护已经创建字符串(key)和它的字符串对象的地址(value),每次创建字符串对象都会和这个字典比较,没有就创建,重复了就用指针进行引用就可以了。intern机制处理字符串长度小于等于20且仅由数字字母下划线构成的,只创建一次。
浮点型
float类型可以认为每个赋值都是创建一个对象,因为float值很多
元组
tuple它是不可变对象,可能是因为查找开销太大,没有实现intern机制,其实就是一个数组,这个数组和c里的数组一样,每次创建都会分配内存空间
常量池
在同一个编译单元(PyFunctionObject)里出现的值相同的常量,只会在常量池里出现一份。常量包括大整数,浮点数,字符串。

 

 

 

REF

https://blog.csdn.net/qq_26442553/article/details/82195061

https://www.cnblogs.com/liyang93/p/6669874.html

https://blog.csdn.net/xingjingb/article/details/81084438

以上是关于Python 零散知识点的主要内容,如果未能解决你的问题,请参考以下文章

python基础--零散知识点

python 零散知识点(列表和字典推导式)

python 零散知识点(列表和字典推导式)

Python 零散知识点

python 零散知识点(复制浅拷贝深拷贝)

python 零散知识点(复制浅拷贝深拷贝)