繁体   English   中英

Str已被定义为全局变量

[英]Str is already defined as a global variable

在使用函数时,我注意到一些非常奇怪的东西。 看起来变量名'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”的变量充当全局变量?

在python中,str()是字符串构造函数。 它用于将对象转换为字符串。

您可以在本地使用它,但是它将覆盖对功能的访问。 您将无法再使用str()。

供参考: https : //docs.python.org/2/library/functions.html#str

类str(object ='')

返回一个字符串,其中包含对象的可很好打印的表示形式。 对于字符串,这将返回字符串本身。 与repr(object)的区别在于str(object)并不总是尝试返回eval()可接受的字符串; 它的目标是返回可打印的字符串。 如果未提供任何参数,则返回空字符串“”。

出于一般知识的目的,如果删除变量,则可以找回构造函数。 例如:

test = 1
str(test)
>>>'1'

str = 2
str(test)
>>>TypeError: 'int' object is not callable

del str

str(test)
>>>'1'

失败的原因:

def Example(x):
   bar = input()
   return bar

print (Example(bar))
#Output: NameError: name 'bar'is not defined

是因为您试图将变量bar传递给Example()方法,但是从未在调用之前的任何位置定义bar

我不确定如何用此方法完成什么,因为您传递了变量但根本不使用它。

评论回应:

str不是内置函数(尽管已在页面上列出),但它是内置类型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)失败。

如果要使用关键字作为变量名,则按照惯例,使用单个的下划线来避免与Python关键字发生冲突,如下所示:

single_trailing_underscore_

cf. PEP 8-Python代码样式指南

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM