Python 中的 GIL 是什么?它如何影响多线程性能?
GIL(Global Interpreter Lock)是 CPython 中的全局解释器锁,它确保任何时刻只有一个线程可以执行 Python 字节码。这使得 Python 多线程在处理 CPU 密集型任务时性能提升有限,但对于 I/O 密集型任务(如网络、文件)依然有效。
Python 中深拷贝与浅拷贝的区别?
浅拷贝仅复制对象本身及其引用的子对象,修改子对象会影响原对象;深拷贝递归复制所有嵌套对象,二者完全独立。使用 copy.copy()
实现浅拷贝,copy.deepcopy()
实现深拷贝。
Python 如何实现协程?
使用 async def
定义协程函数,使用 await
调用异步操作,配合 asyncio
模块实现协程并发。协程适用于高并发网络 I/O 场景。
列表推导式和生成器表达式有何区别?
列表推导式返回一个完整的列表,占用更多内存;生成器表达式返回一个迭代器,惰性求值,占用内存少,适合处理大数据。
Python 装饰器的作用及常见使用场景?
装饰器用于在函数运行前后自动执行额外逻辑,常见场景有:日志记录、权限验证、缓存、计时、事务控制等。
is 和 == 有何不同?
is
比较的是对象的内存地址(是否同一对象);==
比较的是对象的值是否相等。对于整数、字符串等小对象,可能返回相同结果,但语义不同。
Python 内存管理机制是怎样的?
采用引用计数为主,结合标记-清除和分代回收的垃圾回收机制。可以用 gc
模块查看和控制内存管理行为。
如何避免 Python 中的内存泄漏?
避免循环引用、及时释放资源、使用弱引用(weakref
)、确保关闭文件句柄和数据库连接。
如何让一个类支持 with 上下文管理?
需要实现 __enter__()
和 __exit__()
方法。with
语句执行时会自动调用这两个方法进行资源管理。
Python 中有哪些常用的内置数据结构?
包括:list(列表)、tuple(元组)、dict(字典)、set(集合),还有 collections 中的 defaultdict、Counter、deque 等扩展结构。