1、GIL
python当中的多线程是假的多线程?对这句话怎么理解?这个问题的本质问的就是GIL。
GIL,全局解释器锁,在Cpython中,同一时刻只可以有一个线程执行字节码。
其解决了多线程下的数据访问安全,但是也使得多线程无法充分发挥多核的性能
比如:写个死循环代码,查看cpu使用率。大家想一下,会是什么样子的结果?
解决:
1、IO密集型的任务可以使用多线程
2、cpu密集型的任务应当使用多进程(多进程可以充分使用cpu的性能)
3、使用C扩展可以绕过GIL
4、使用非C语言的python没有GIL
https://docs.python.org/3.8/library/threading.html#lock-objects
2、python中常用的数据结构有哪些?
1、数字(整数、浮点)w
2、字符串 字节
3、列表 元组
4、字典 集合-----可哈希 不可哈希的
5、其他:布尔值 、None、datetime、各种类
一切皆对象,所有的变量和数据都是某个类的实例
ps:这个问题很常见,面试也很容易被问,我被问到过几次。但是1-4很多人都很容易的回答出来,把第5点给忽略了。以后要注意。不要只是为了面试背诵几个题目,要深入理解这门语言,然后为自己所用。
3、函数中可否定义函数
可以
函数A中的函数B,其变量访问顺序为函数B---函数A---全局变量--内置变量
LEGB
字母 | 英语 | 释义 | 简称 | 作用空间 |
---|---|---|---|---|
L | Local(function) | 当前函数内的作用域 | 局部作用域 | 局部 |
E | Enclosing Functions Locals | 外部嵌套函数的作用域 | 嵌套作用域 | 局部 |
G | Global(module) | 函数外部所在的命名空间 | 全局作用域 | 全局 |
B | Built In(python) | Python内置模块的命名空间 | 内建作用域 | 内置 |
E 闭包作用变量会导致内存泄漏的问题,代码举例子:
class A:
def __init__(self):
print("我被创建了")
def __del__(self):
print("我被销毁了")
def a():
s = A()
# E闭包中的变量
def b():
return s
return b()
_ = a()
import pdb
pdb.set_trace()
运行结果:
D:\zl\Scripts\python.exe D:/cy/zl/gg.py
我被创建了
--Return--
> d:\zl\gg.py(24)<module>()->None
-> pdb.set_trace()
(Pdb)
对象只被创建 ,没销毁,内存没回收。
4、*args **kwargs 分别代表什么意思
*args不定长位置参数,args是一个元组
**kwargs不定长关键字参数,kwargs是一个字典
扩展:
l = [1, 2, 3, 4]
a, b, c, d = l # 解包
def f():
return 1, 2, 3, 4
a, b, *c = f()# 解包
def ff(*args, **kwargs):
kwargs["c"] = "zz"
print(args) # 普通元组
print(kwargs) # 普通字典
ff(a=1, c=3)
上面这段代码,问题:
关键字c的value能够被修改成功吗?期待大家回答,可以自行尝试
def ff(*args, **kwargs):
kwargs["c"] = "zz"
print(args) # 普通元组
print(kwargs) # 普通字典
a = ("2", "3")
b = dict(a=1, d=3)
上面这段代码,调用ff()函数的时候,里面的a,b如何放置,是ff(a,b)吗?留下你们的答案
5、定义函数的时候,使用list作为默认参数会有什么问题?
默认参数只在函数定义被赋值一次,并不会重新赋值或者自动清空
后续每次调用函数使用默认参数时,使用的都是同一个列表,对列表的操作会被保留
def f(l=[]): # 参数在定义的时候创建
# 局部变量在执行的时候创建
l.append(1)
return l
f()
f()
l = f()
print(l)
打印结果是什么?自行尝试奥
# 代码做修改
def f(): # 参数在定义的时候创建
# 局部变量在执行的时候创建
l = []
l.append(1)
return l
f()
f()
l = f()
print(l)
打印结果又是什么?自行尝试奥
总结:
函数的参数默认值应该是不可变对象,比如字符串
不然被其他的人看到你写的这样子的代码,会被骂死奥
写在最后:今天就先搞5个题目玩玩吧,自己多动手写代码是王道啊