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
相关产品推荐
相关产品推荐

