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)里出现的值相同的常量,只会在常量池里出现一份。常量包括大整数,浮点数,字符串。

嵌套函数:

python允许创建嵌套函数。也就是说我们可以在函数里面定义函数,而且现有的作用域和变量生存周期依旧不变。

例子:

def outer():

name="python"

def inner():#outer函数内部定义的函数

print(name)

return inner()#返回该内部函数

outer()

 

 x: List[int] = [1, 2, 3, 4]

 

__call__ : Callable[…, Any] = _call_impl

 

forward: Callable[…, Any] = _forward_unimplemented

 

 with open("/tmp/foo.txt") as file:

    data = file.read()

 

with transaction(db):

  # do some actions

 

 

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

查看原文