Str已经被定义为全局变量

时间:2018-05-10 15:52:58

标签: python string variables global

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

3 个答案:

答案 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_

比照。 PEP 8 -- Style Guide for Python Codes