Python常见面试题

📅 发布时间:2026/8/25 10:31:04
Python常见面试题 1. Python有哪些内置数据类型常见的有int,float,bool,str,list,tuple,dict,set。2. Python中列表和元组的区别列表list可变可增删改元组tuple不可变定义后不能修改。3. Python的深拷贝和浅拷贝有什么区别浅拷贝复制对象的引用改变子对象会影响原对象。深拷贝复制对象及其所有子对象完全独立。浅拷贝shallow copyimport copy original [1, 2, [3, 4]] shallow_copied copy.copy(original) print(原始列表:, original) print(浅拷贝列表:, shallow_copied) # 修改浅拷贝内嵌列表 shallow_copied[2].append(5) print(\n修改浅拷贝后的原始列表:, original) print(修改浅拷贝后的浅拷贝列表:, shallow_copied)输出原始列表: [1, 2, [3, 4]] 浅拷贝列表: [1, 2, [3, 4]] 修改浅拷贝后的原始列表: [1, 2, [3, 4, 5]] 修改浅拷贝后的浅拷贝列表: [1, 2, [3, 4, 5]]可以看到修改了浅拷贝的内嵌列表原始列表也会改变因为它们共享内嵌列表对象。深拷贝deep copyimport copy original [1, 2, [3, 4]] deep_copied copy.deepcopy(original) print(原始列表:, original) print(深拷贝列表:, deep_copied) # 修改深拷贝内嵌列表 deep_copied[2].append(5) print(\n修改深拷贝后的原始列表:, original) print(修改深拷贝后的深拷贝列表:, deep_copied)输出原始列表: [1, 2, [3, 4]] 深拷贝列表: [1, 2, [3, 4]] 修改深拷贝后的原始列表: [1, 2, [3, 4]] 修改深拷贝后的深拷贝列表: [1, 2, [3, 4, 5]]这里修改深拷贝对象里的内嵌列表原始列表保持不变。探究浅拷贝和对象赋值我们常见的代码赋值写法b [1, 2, 3] a b这是让变量a和b指向同一个列表对象a和b引用的是内存中同一个列表通过a修改列表内容b也会看到变化反之亦然。这种效果类似于浅拷贝但实际意义不同。ab是指向同一个对象也就是指向的内存地址是完全一样的但浅拷贝a、b就分别指向不同的列表对象那这就有个疑问了浅拷贝会改变原始列表的值有啥用处啊为啥不干脆直接修改原始列表这是个很好的问题浅拷贝看起来修改了拷贝里的可变子对象会影响原始对象似乎没啥用——但它其实有几个实际场景和意义1.避免改变顶层对象但允许共享子对象浅拷贝创建了新的顶层容器比如新的列表对象这样你在拷贝的容器上添加、删除、替换元素不会影响原始容器但子对象仍共享节省了内存。import copy original [[1, 2], [3, 4]] shallow copy.copy(original) # 改变顶层结构 shallow.append([5, 6]) print(original) # 原始列表不变 # 改变子对象内容 shallow[0].append(99) print(original) # 子对象被修改原始列表看到变化这样做的用处在于比如你想临时拓展原始列表而不影响它结构但又想共享子数据避免内存消耗。或者顶层改变独立子对象共享方便节省资源。2.性能和内存考虑深拷贝会递归复制所有子对象时间和空间开销大。浅拷贝只复制最外层对象速度快适合不需要递归复制的情况。3.某些场景必须共享子对象有时候子对象本身就是“不可分割的状态”希望在多个结构中共享更新比如共享缓存、配置、连接池等。4.区别“修改结构”和“修改内容”修改结构如添加、删除元素在浅拷贝副本是独立的不影响原始列表。修改内容如修改子列表里的元素共享会影响原始。这提供了更灵活的设计空间可以根据需求控制修改的影响范围。4. 什么是Python的GIL全局解释器锁GIL使得同一时刻只有一个线程在执行Python字节码限制多线程并发影响CPU密集型任务。5. Python装饰器是什么怎么使用装饰器是用于修改函数或类行为的高阶函数通常使用decorator语法调用。6. 列表推导式写法示例squares [x**2 for x in range(10)]它的含义是对range(10)里的每个x计算x的平方生成一个列表。range(10)生成[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]把每个元素平方所以squares的结果是[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]7. Python如何实现多线程和多进程多线程用threading模块多进程用multiprocessing模块。8. Python中如何管理内存Python采用引用计数和垃圾回收GC机制管理内存。9. 什么是迭代器和生成器迭代器是实现了__iter__和__next__方法的对象生成器用yield生成迭代器支持惰性求值。迭代器示例class MyIterator: def __init__(self, data): self.data data self.index 0 def __iter__(self): return self # 迭代器返回自己 def __next__(self): if self.index len(self.data): val self.data[self.index] self.index 1 return val else: raise StopIteration # 到尾部时抛出异常 # 使用迭代器 iter_obj MyIterator([10, 20, 30]) for num in iter_obj: print(num)生成器示例用yielddef my_generator(): yield 10 yield 20 yield 30 # 使用生成器 for num in my_generator(): print(num)特点迭代器生成器定义通过类实现定义__iter__和__next__通过函数和yield语句使用复杂度相对复杂需要手写类和方法简洁写函数即可内存效率少量数据时无需特殊考虑生成时才计算更省内存适用场景自定义复杂数据结构的遍历惰性生成数据简化迭代实现10. 类和实例之间的区别类是对象模板定义属性和方法实例是类的具体对象有独立状态。11. Python中*args和**kwargs的作用*args传递可变数量的位置参数**kwargs传递可变数量的关键字参数。示例def func(*args): print(args , args) for i, val in enumerate(args): print(farg {i}: {val}) func(1, 2, 3)def func(**kwargs): print(kwargs , kwargs) for key, val in kwargs.items(): print(f{key} {val}) func(a1, b2, c3)12. Python中如何捕获异常python 复制 try: x int(input(请输入一个整数: )) result 10 / x except ValueError: print(捕获 ValueError输入的不是有效整数) except ZeroDivisionError: print(捕获 ZeroDivisionError除数不能为零) except Exception as e: print(捕获其他异常:, e) else: print(计算结果是:, result)except ValueError:处理转换整数失败的异常except ZeroDivisionError:处理除以零异常except Exception as e:处理其他未捕获的异常可选else:当没有异常发生时执行finally:如果需要无论有没有异常都会执行的代码可以写在这里13. Python字典的底层实现字典采用哈希表实现键必须是可哈希不可变类型。14. 怎么判断一个对象是否是某个类的实例isinstance(obj, ClassName)15. Python的with语句作用用于简化资源管理实现上下文管理器协议自动释放资源。class MyContext: def __enter__(self): print(进入上下文) return 资源 def __exit__(self, exc_type, exc_value, traceback): print(离开上下文) with MyContext() as resource: print(f使用{resource})输出 进入上下文 使用资源 离开上下文16. Python中的多继承是什么有什么问题一个类继承多个父类可能引起方法解析顺序MRO混乱需注意调用顺序。什么是 MRO 混乱当多个父类存在重叠继承关系或者继承结构复杂时Python 需要根据一定规则合并各个类的方法查找顺序。如果继承关系设计不当Python 可能无法推导出一个满足所有父类继承约束的线性顺序会报错TypeError: Cannot create a consistent method resolution order (MRO)。这就是所谓的 MRO 混乱。代码示例展示 MRO 混乱导致的错误class A: pass class B(A): pass class C(A): pass # 下面这个类继承顺序冲突会报错 class D(B, C): pass class E(C, B): pass class F(D, E): # 这里继承冲突MRO 无法解析会报错 pass一个正常的多继承 MRO 示例class X: def greet(self): print(Hello from X) class Y(X): def greet(self): print(Hello from Y) class Z(X): def greet(self): print(Hello from Z) class M(Y, Z): pass obj M() obj.greet() print(M.mro())输出Hello from Y [class __main__.M, class __main__.Y, class __main__.Z, class __main__.X, class object]多继承时Python 用 C3 算法计算 MRO。如果继承链设计巧妙、顺序合理MRO 是清晰且唯一的。如果父类继承顺序冲突就会报 MRO 混乱错误。设计多继承时尽量避免复杂的菱形继承和顺序不一致。17. Python中lambda表达式如何使用匿名函数语法lambda 参数: 表达式适合小函数。square lambda x: x ** 2 print(square(5)) # 输出 25 nums [1, 2, 3, 4, 5, 6] evens list(filter(lambda x: x % 2 0, nums)) print(evens) # 输出 [2, 4, 6]18. Python中如何读取和写入文件# 读取整个文件内容 with open(example.txt, r, encodingutf-8) as f: content f.read() print(content) with open(example.txt, r, encodingutf-8) as f: for line in f: print(line.strip()) # strip去掉行尾换行符 with open(output.txt, w, encodingutf-8) as f: f.write(这是写入文件的内容。\n) f.write(支持中文字符。\n) with open(output.txt, a, encodingutf-8) as f: f.write(追加一行内容。\n)19. Python支持哪些内置数据结构列表list、元组tuple、字典dict、集合set。20. Python中常见的标准库有哪些os,sys,re,json,datetime,collections,itertools,threading等。