Python中使用内置函数作为变量时del操作的行为差异探究
为什么Python中
del内置函数变量的行为有差异? 这个问题问得特别有意思!本质上是Python的命名空间查找规则在搞事情,咱们用日常场景打个比方就秒懂了:
想象Python有两层抽屉:
- 你的「私人抽屉」:对应当前作用域(比如全局作用域),里面放着你自己定义的变量。
- 「公共抽屉」:对应内置命名空间,里面装着所有Python自带的内置函数和类型,比如
set、list这些。
第一种场景:先覆盖内置函数再del
当你执行:
set = 1 print(set) # 输出1 del set a = set([1,2,3]) print(a) # 输出{1, 2, 3}
- 第一步
set=1:你在「私人抽屉」里放了一个叫set的盒子,里面装的是数字1。这时候你找set,肯定先翻自己的私人抽屉,完全不会碰公共抽屉里那个原本装着集合函数的盒子。 - 第二步
del set:你把私人抽屉里的set盒子扔了。现在私人抽屉里没这个盒子了,再找set的时候,就会自动去公共抽屉里找,自然就拿到了原本的set函数,所以能正常创建集合。
第二种场景:直接del未被覆盖的内置函数
当你执行:
del set a = set([1,2,3]) print(a) # 抛出NameError
这时候你没在私人抽屉里放过set盒子,直接执行del set,Python会怎么处理?
- 默认情况下,你的私人抽屉里根本没有
set这个条目,那del操作会直接去碰「公共抽屉」里的set盒子,把它删掉。 - 等你再想找
set的时候,私人抽屉里没有,公共抽屉里也被你删了,自然就找不到这个名字,抛出NameError。
核心总结
两种场景的差异根源,在于**del操作的目标命名空间不同**:
- 先覆盖再
del:删的是「当前作用域」里你自己定义的变量,内置函数还好好待在公共命名空间里。 - 直接
del未覆盖的内置函数:删的是「内置命名空间」里的原始函数,整个程序就彻底找不到这个名字了。
最后还是要提醒一句:虽然这个机制挺有意思,但用内置函数名当变量名确实是不良实践,很容易搞混逻辑,日常写代码一定要避免哦!
内容的提问来源于stack exchange,提问作者JacobIRR
相关产品推荐
相关产品推荐

