[1,2,3]+[4,5,6]的结果是多少?
[1,2,3] + [4,5,6] 在 Python 里是啥?
你可能觉得这不就是加法么,那肯定是报错呗,怎么能两个 list 相加?但 Python 偏偏就支持,你把这俩 list 加起来,它就给你拼接在一起,输出结果是:
[1, 2, 3, 4, 5, 6]
是不是一瞬间感觉“哇哦”,怎么这么神奇?但也别高兴太早,面试官问这个问题,八成不是考你语法基础,是想挖你背后的理解深度。你要是就回他一句“结果是列表拼接”,那基本凉凉,HR那边已经在打印感谢信了。🤷
所以这题到底怎么讲,才能让面试官眼前一亮?我觉得可以从以下几个角度来聊。
首先我们来揭底,Python 里 + 对 list 做的操作,其实是调用了 list 的 __add__ 魔法方法,等价于:
[1, 2, 3].__add__([4, 5, 6])
这个方法的语义就是列表拼接。再直白点说,你以为它是数学上的加法,其实它是“append 不改原对象版”。
这个有啥问题?问题大了去了。
比如你看下面这个例子:
a = [1, 2, 3]
b = [4, 5, 6]
c = a + b
print(a) # [1, 2, 3]
print(c) # [1, 2, 3, 4, 5, 6]
a 没变!这说明啥?说明 + 不是 in-place 操作,而是新建了一个 list。面试官要是跟你聊“可变对象 vs 不可变对象”,你就顺着这个话题说下去,能多得 10 分。
然后你还可以扯一点 Python 的“鸭子类型”哲学。你跟面试官说:“其实不止 list,这种 + 操作还适用于 tuple、str,只要对象实现了 __add__ 方法就行。” 比如:
"hello" + "world"# 输出: 'helloworld'
(1, 2) + (3, 4) # 输出: (1, 2, 3, 4)
面试官听到你能从 list + list 讲到 str + str,他心里就知道你不仅知道结果,还理解了背后的运作机制。
然后你再顺势讲讲它的坑。
比如某些初学者在循环里这么写:
result = []
for i in range(10000):
result = result + [i]
乍一看没啥问题,但性能会炸裂慢。为什么?因为每次 + 都会创建一个新 list,再拷贝前一个列表的内容,O(n²)的灾难现场。你要是能当场给出正确写法,那面试官多半会觉得你不是只会背 API 的人。
result = []
for i in range(10000):
result.append(i)
或者用列表推导式:
result = [i for i in range(10000)]
这才是性能和可读性都不错的解法。
如果对面再追问:“那你知不知道 += 和 + 的区别?”这个时候你一定要说:“哎,这个坑我踩过!”然后开始表演。
a = [1, 2, 3]
b = a
a += [4, 5]
print(b) # 输出: [1, 2, 3, 4, 5]
b 怎么变了???就是因为 += 是 in-place 操作,相当于调用了 a.__iadd__([4, 5]),改的是原地对象,而不是生成一个新对象。这种行为,在可变对象上非常容易出 bug,尤其是 list 被多个变量引用时。
讲这个例子的时候,面试官要是笑了,那基本你稳了,说明他踩过这个坑,或者被这个坑背锅过……
最后别忘了可以用这个话题聊聊 Python 的数据结构设计哲学。你可以说:
“我个人特别喜欢 Python 的这种接口设计,把操作抽象成方法,比如 __add__、__iadd__,让我们既可以用面向对象的方式操作数据,又能写出类似函数式的风格,挺灵活的。当然也正因为灵活,才会在很多时候带来一些理解偏差和性能坑,初学者特别容易栽在这上面。”
你这样一通输出下来,面试官可能原本只是随口一问,结果突然意识到——这哥们真的懂,不是靠刷题刷出来的,是下过功夫在理解语言本身。
最后,我为大家打造了一份deepseek的入门到精通教程,完全免费:https://www.songshuhezi.com/deepseek
也可以看我写的这篇文章《DeepSeek满血复活,直接起飞!》来进行本地搭建。
对编程、职场感兴趣的同学,大家可以联系我微信:golang404,拉你进入“程序员交流群”。
虎哥作为一名老码农,整理了全网最全《python高级架构师资料合集》。