Python Related
📠

Python Related

 
 
 
简单总结:
  • 在 Python 3 中,print 原本是一个 builtin function,位于 builtins 模块里,因此才能在任何地方直接用。
  • 如果你写了 print = 5,只是覆盖了当前作用域的名字;真正的内建 print 仍在 builtins.print 中,可以用 del printprint = builtins.print 恢复。
 
 
下面给你面试官最喜欢的版本,结构清晰、重点突出,不啰嗦但内容完整。

✅ Python vs C++ 的核心区别(面试标准回答)

1. 语言类型:动态 vs 静态

Python

  • 动态类型(运行时决定类型)
  • 更灵活,但运行时开销大

C++

  • 静态类型(编译期确定类型)
  • 更快、更安全(类型检查严格)

2. 执行方式:解释 vs 编译

Python

  • 解释执行(CPython 一行一行跑)
  • 适合快速开发、脚本、数据分析

C++

  • 编译成机器码,靠 g++/clang 优化
  • 运行速度极快,适合高性能场景(游戏、系统、交易)

3. 运行速度(巨大差距)

  • C++ 是 native code → 非常快
  • Python 因解释器机制 → 慢 10–100x
面试官希望你强调:
性能敏感的部分会用 C++,Python 常作为 glue language。

4. 内存管理方式

Python

  • 自动垃圾回收(引用计数 + GC)
  • 开发轻松,但不可精准控制

C++

  • 手动管理 or 智能指针
  • 可以做细粒度优化,但更复杂

5. 编程范式支持

Python

  • 动态、脚本、面向对象、函数式
  • 适合 AI、数据科学、自动化

C++

  • 面向对象 + 泛型编程(templates)
  • 模板元编程非常强
  • 支持底层系统编程

6. 标准库和生态

Python

  • 丰富的库:NumPy / Pandas / TensorFlow / PyTorch
  • 生态非常强(特别是数据科学、AI)

C++

  • STL 强大(vector/map/set)
  • Boost、游戏引擎、系统库成熟
  • 更偏底层、不如 Python 方便

7. 易用性

Python

  • 简洁、语法简单
  • 适合快速迭代

C++

  • 复杂:指针、内存、模板、编译器、链接
  • 但性能顶级

🎯 30 秒面试回答版本(非常推荐)

Python 是动态类型、解释执行、自动内存管理,适合快速开发和数据科学,但运行速度较慢。
C++ 是静态类型、编译执行、手动或智能指针管理内存,性能极高,适合系统级或性能敏感的场景。
Python 更易用、生态好;C++ 更底层、可控性强但开发难度大。

🎯 一句话超短版本(针对脑筋急转弯式面试)

Python 追求开发效率;C++ 追求执行效率。

如果你想,我可以帮你写一个 FAANG/量化面试风格的版本,或 更偏底层系统的版本
 

Python2 & Python3 区别

Python 3 在语法和语义上做了大量清理:
1)print 变成函数;
2)字符串默认是 Unicode,而 Python2 的 str 是 bytes;
3)整数除法变成浮点除法;
4)统一了 xrange → range;
5)异常写法改为
except Exception as e:
此外 Python 2 在 2020 年已经停止维护,因此现在所有新项目都用 Python 3。
 
 
 
非常好 👍 我来帮你把我们刚才关于 Python 拷贝机制(list / DataFrame / 函数参数 / 递归 / 浅拷贝 / 深拷贝) 的所有内容做一个完整、清晰、分层的总结。
这是一份可以当作笔记使用的总结讲解👇

🧭 Python 拷贝与可变对象的核心机制详解


一、默认参数陷阱:为什么常写 x=None

📍 现象

def f(x=[]): x.append(1) return x print(f()) # [1] print(f()) # [1, 1] ← 意外累积!

📘 原因

  • Python 的默认参数在函数定义时求值,只创建一次;
  • 所以 [] 在所有调用间被共享

✅ 正确写法

def f(x=None): if x is None: x = [] ...
→ 每次调用都会新建一个独立的 list。
🧠 用 None 作为「安全占位符」,防止可变对象被意外共享。

二、在递归中如何安全地传 list / dict

目标
正确写法
是否共享
每次独立
def dfs(node, path=None)
❌ 不共享
同一调用链共享
显式传入参数
✅ 共享
分支独立
dfs(node.left, path[:])
❌ 副本
错误写法
def dfs(node, path=[])
⚠️ 全局共享
💡 一般模板:
def dfs(node, path=None): if path is None: path = [] ... dfs(node.left, path)

三、Python 中的浅拷贝与深拷贝

概念
定义
浅拷贝 (shallow copy)
只复制最外层容器,内部元素仍是原对象引用
深拷贝 (deep copy)
递归复制所有层级对象,完全独立

🧠 示例

import copy a = [[1, 2], [3, 4]] b = a.copy() # 浅拷贝 c = copy.deepcopy(a) # 深拷贝 b[0].append(99) print(a) # [[1, 2, 99], [3, 4]] ← 被影响 c[0].append(100) print(a) # [[1, 2, 99], [3, 4]] ← 不受影响

📊 区别总结

方法
外层是否新建
内层是否独立
是否影响原对象
b = a
❌ 否
❌ 否
✅ 会
b = a.copy()
✅ 是
❌ 否
⚠️ 内层会
b = copy.deepcopy(a)
✅ 是
✅ 是
❌ 不会

四、list.copy() 是浅拷贝

✅ 外层新建,内部共享

a = [[1, 2], [3, 4]] b = a.copy() b[0].append(99) print(a) # [[1, 2, 99], [3, 4]]

🧠 原因

list.copy() 等价于:
b = a[:] # 或 b = list(a)
都是浅拷贝。
🟢 外壳不同
🔴 内层引用相同

五、Pandas 的拷贝规则

📘 DataFrame 的 .copy()

b = df.copy() # 深拷贝(默认 deep=True) b = df.copy(deep=False) # 浅拷贝,共享底层数据
写法
是否复制数据
修改 b 会影响 df 吗
b = df
❌ 否
✅ 会
b = df.copy(deep=False)
❌ 否(仅复制结构)
⚠️ 可能会
b = df.copy(deep=True)
✅ 是
❌ 不会
💡 deep=False 主要用于性能优化(共享内存,只读操作)。
⚠️ 若你要修改 b,请务必使用 deep=True

六、Pandas 布尔索引与 .loc[]

🧩 常见用法

df2 = df[df["A"] > 0] df2 = df.loc[df["A"] > 0]

✅ 区别与结论

写法
行为
推荐
df[mask]
行筛选简写
可用
df.loc[mask]
显式行筛选
✅ 推荐
df.loc[mask, cols]
同时筛行列
✅ 推荐
二者返回结果通常相同,但:
  • 是否是视图 (view) 不确定;
  • 有时修改会影响原 df
  • 为安全,请用 .copy()
df2 = df.loc[df["A"] > 0].copy()

七、视图 (view) vs 拷贝 (copy)

类型
内存共享
修改会影响原对象
例子
视图 (view)
✅ 是
✅ 会
numpy 切片、df.loc[1:3]
浅拷贝 (shallow copy)
🔸 外层否,内层是
⚠️ 内层会
list.copy()
深拷贝 (deep copy)
❌ 否
❌ 不会
copy.deepcopy()
📍 Pandas 的布尔筛选 df[mask].loc[] 有时是视图、有时是副本,
不要依赖其返回类型,修改前先 .copy()

八、浅拷贝存在的意义

浅拷贝不是“错误”,而是“性能优化策略”。
用途包括:
  1. 避免大规模复制(节省内存);
  1. 只读分析
  1. 共享底层数据视图(高效查看同一块数据);
  1. 构造轻量级结构变体(例如改列名但不复制数据)。
但⚠️修改时请谨慎,否则会污染原数据。

九、在代码中的推荐实践

场景
推荐写法
函数默认参数
def f(x=None): ...
递归收集结果
def dfs(node, path=None): ...
拷贝 list
b = a.copy() (浅拷贝)
完全独立
import copy; b = copy.deepcopy(a)
拷贝 DataFrame
b = df.copy(deep=True)
安全筛选 DataFrame
df2 = df.loc[mask].copy()
只读性能优化
df2 = df.copy(deep=False)

🔚 十、一句话总览

关键词
解释
浅拷贝
复制外壳,共享内容(list.copy、df.copy(deep=False))
深拷贝
完全独立副本(copy.deepcopy、df.copy(deep=True))
视图
仅共享底层数据的“窗口”(numpy切片、df.loc[1:3])
默认参数陷阱
默认参数只初始化一次,应使用 None 占位
最佳实践
修改前 .copy(),函数参数默认用 None

总结一句话:
Python 中所有可变对象(list、dict、DataFrame 等)默认都是「引用语义」:
  • 如果想独立,必须拷贝。
  • copy() 是浅拷贝,deepcopy() 是深拷贝。
  • 在函数、递归、Pandas 筛选等场景下,都要显式控制是否共享底层数据。

是否希望我帮你生成一张可视化「拷贝类型关系图」(箭头显示哪些层共享内存、哪些独立)?那张图会非常直观地总结这一整套内容。