很多程序员第一次被面试官问到这道题时。
心里都是一样的。
简单。
太简单了。
甚至有些不屑。
结果。
往往死得很惨。
😅
最近在牛客网看到一位同学分享面经。
面试官问:
a = [1, 2, 3]b = [1, 2, 3]print(a == b)print(a is b)
他秒答:
面试结束。
没有然后了。
为什么?
因为这道题看似简单。
实则是大厂最喜欢的那类问题:
一道题,直接看出你对Python底层理解有多深。
先说答案
运行结果:
原因是什么?
很多人背过:
没错。
但如果面试时只回答这一句。
大概率拿不到高分。
因为面试官真正想听的。
根本不是结论。
而是原理。
Python变量到底是什么?
这是很多人的知识盲区。
例如:
很多人觉得:
变量a里面存了100。
其实不准确。
更准确的说法应该是:
变量本质上保存的是:
对象引用
或者说:
内存地址。
所以:
不是复制数据。
而是让两个变量同时指向同一个对象。
这时候:
结果自然是:
为什么大厂喜欢考这个?
因为它背后牵扯着Python对象模型。
而对象模型又影响:
甚至影响性能优化。
很多开发事故。
本质上都是对象引用没搞明白。
一个阿里经典追问题
面试官继续问:
a = 256b = 256print(a is b)
结果?
再看:
a = 1000b = 1000print(a is b)
有时候是True。
有时候是False。
为什么?
这里涉及:
小整数缓存机制
CPython为了提升性能。
会提前缓存:
之间的整数对象。
所以:
只创建一次。
多个变量共享。
这是一种典型的:
空间换时间
设计思想。
牛客网出现频率极高的另一个问题
为什么字典查询这么快?
这个问题在很多面经里反复出现。
例如:
执行:
几乎瞬间完成。
原因是什么?
答案:
哈希表
字典不会从头遍历。
而是:
直接计算位置。
一步找到数据。
所以平均时间复杂度:
而列表查找:
这也是为什么。
互联网公司后台系统里。
哈希表无处不在。
缓存如此。
推荐系统如此。
搜索系统也是如此。
字节跳动近几年特别喜欢问什么?
答案是:
深拷贝和浅拷贝
例如:
import copya = [[1,2]]b = copy.copy(a)b[0][0] = 100print(a)
结果:
为什么?
因为:
浅拷贝只复制第一层。
内部对象仍然共享。
这一题几乎是牛客网常驻嘉宾。
很多开发者工作几年后。
依然会在这里踩坑。
微软更喜欢追问
为什么Python多线程跑不满CPU?
于是:
GIL来了。
牛客网上关于GIL的问题同样长期高频出现。
简单来说:
全局解释器锁。
意味着:
同一时刻。
只有一个线程执行Python字节码。
所以:
CPU密集型任务。
多线程效果有限。
而:
这种IO密集型场景。
多线程依然非常有效。
AI时代,一个有趣现象出现了
过去面试:
考语法。
考API。
考框架。
今天越来越多大厂开始考:
底层原理
为什么?
因为AI已经能写代码了。
甚至能写得不错。
但AI替代不了什么?
理解。
判断。
取舍。
比如:
什么时候用列表?
什么时候用集合?
什么时候用字典?
什么时候该用多进程?
什么时候该用协程?
这些问题。
没有标准答案。
只有工程经验。
我的一个观点
未来Python工程师会分成两类。
第一类:
会调用AI的人。
第二类:
会判断AI的人。
前者越来越多。
后者越来越值钱。
因为:
AI负责生成代码。
而工程师负责决定:
代码是否合理。
架构是否可靠。
性能是否达标。
安全是否过关。
写在最后
这些年看过无数面试题。
最后发现:
大厂真正想筛选的人。
从来不是记忆力最好的人。
而是:
理解力最强的人。
所以。
下次再看到:
这些知识点时。
不要急着背答案。
先问自己一句:
为什么这样设计?
当你开始追问底层逻辑的时候。
你会发现。
自己学的不再是Python。
而是在学习计算机科学本身。🚀
点个「在看」👍
愿你未来面对任何一道面试题时,看到的不只是答案,而是答案背后的世界。