我在使用函数时发现了一些非常奇怪的东西。看起来变量名'str'已经被定义为全局变量。看看:
def Example(x):
str = input()
return str
print (Example(str))
#When typing 'Hello!' Output --> Hello!
变量str在函数Example中定义。那么为什么没有NameError:名称'str'没有定义?
当我调用变量x或其他东西时(在本例中为'bar'):
def Example(x):
bar = input()
return bar
print (Example(bar))
#Output: NameError: name 'bar'is not defined
为什么名为'str'的变量充当全局变量?
答案 0 :(得分:5)
在python中,str()是字符串构造函数。它用于将对象强制转换为字符串。
您可以在本地使用它,但它会覆盖对该功能的访问权限。你将无法使用str()了。
供参考: https://docs.python.org/2/library/functions.html#str
class str(object ='')
返回一个包含一个很好的可打印表示形式的字符串 宾语。对于字符串,这将返回字符串本身。区别 与repr(对象)是str(对象)并不总是尝试 返回eval()可接受的字符串;它的目标是回归 可打印的字符串。如果没有给出参数,则返回空字符串, ''
出于一般知识的目的,如果删除变量,可以返回构造函数。例如:
test = 1
str(test)
>>>'1'
str = 2
str(test)
>>>TypeError: 'int' object is not callable
del str
str(test)
>>>'1'
答案 1 :(得分:2)
失败的原因:
def Example(x):
bar = input()
return bar
print (Example(bar))
#Output: NameError: name 'bar'is not defined
是因为您尝试将变量bar
传递给Example()
方法,但在调用之前的任何地方都没有定义bar
。
我无法确定你想用这种方法完成什么,因为你传递了一个变量,但根本不使用它。
评论回复:
str
不是内置函数(尽管列在page上),而是内置类型str
的构造函数。要表明您只是重新分配与关键字相关联的方法(不一定保留,但仍然是关键字),请考虑以下事项:
>>> str
<class 'str'>
>>> abs
<built-in function abs>
>>> str = abs
>>> str
<built-in function abs>
因此,您基本上覆盖了str
类构造函数的赋值。我在此示例中使用了abs
,但input
同样适用(带有扭曲):
>>> str
<class 'str'>
>>> input
<built-in function input>
>>> str = input
>>> str
<built-in function input>
>>> str = input()
hello world
>>> str
'hello world'
这里的区别是您为关键字str
指定了一个字符串(类型为str
)。因此,您永远不能使用str(10)
来获取'10'
,因为现在就像调用失败的hello world(10)
一样。
答案 2 :(得分:1)
如果要将关键字用作变量名,按照惯例,使用单个尾随下划线来避免与Python关键字冲突,如下所示:
single_trailing_underscore_