You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python中为何str作为函数实参无NameError,自定义变量却报错?

为什么str变量表现得像全局变量?

嘿,这个问题其实是Python内置名称在搞鬼!咱们把这个现象拆解开来看:

核心原因:str是Python的内置全局名称

你第一个例子里的str,根本不是你自定义的“新变量”——它是Python解释器启动时就自动加载到全局作用域的内置构造函数,用来表示字符串类型(比如str(123)可以把数字转成字符串)。

所以当你写print(Example(str))时,传递给Example函数的参数是全局作用域里的内置str对象,而不是你函数内部定义的那个局部str变量。这也是为什么没有触发NameError的原因——Python确实能找到这个名称!

对比自定义变量bar的情况

而第二个例子里的bar是你自己想出来的名称,全局作用域里从来没定义过它。当你尝试把bar作为参数传给Example时,Python在全局和当前局部作用域里都找不到这个名称,自然就抛出NameError了。

额外提醒:别遮蔽内置名称!

虽然你的第一个例子能运行,但非常不建议用Python内置名称作为自定义变量名。函数内部的str = input()其实是在局部作用域里“遮蔽”了全局的内置str,如果后续在函数里想调用str()的功能(比如把数字转成字符串),就会报错——因为此时局部的str已经变成你输入的字符串,不再是构造函数了!

比如试试这段代码,就会出问题:

def Example(x):
    str = input()
    return str(123)  # 报错:'str' object is not callable
print(Example(str))

内容的提问来源于stack exchange,提问作者Hugo de Heer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 06:59:23