【问题标题】:Str is already defined as a global variableStr 已经定义为全局变量
【发布时间】:2018-05-10 15:52:57
【问题描述】:

我在使用函数时发现了一些非常奇怪的东西。看起来变量名“str”已经定义为全局变量。看看:

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

print (Example(str))
#When typing 'Hello!' Output --> Hello! 

变量str在函数Example中定义。那么为什么没有 NameError: name 'str' is not defined?

当我调用变量 x 或其他东西时(在本例中为“bar”):

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

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

为什么名称为“str”的变量充当全局变量?

【问题讨论】:

标签: python string variables global


【解决方案1】:

在 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'

【讨论】:

  • 次要问题,但str() 不是用于强制转换的函数。它是 str 对象的构造函数。
  • 谢谢!使用 str() 函数确实不再起作用(UnboundLocalError)。我现在知道你永远不应该给变量命名,比如变量类型。比如浮点数、整数等。
  • 类覆盖是的。
  • 除非你del str。原版还在 :)
  • 感谢您的反馈。随着操作的学习,我通过示例将其添加到答案中。一般知识
【解决方案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) 失败一样。

【讨论】:

  • 我的意思是显示名为“str”的变量与例如“bar”的输出之间的差异。我明白为什么 varname = 'bar' 会导致异常。
  • @HugodeHeer 这是因为您正在重新映射与该保留字关联的函数。
  • 它不完全是保留字,否则在赋值时会出现语法错误。试试for=0str是一个内置函数。内置是最后搜索的命名空间(在全局之后)。
  • 我上面的评论更多是为了@HugodeHeer,但忘了提到他。
【解决方案3】:

如果您想使用关键字作为变量名,按照惯例,使用单个尾随下划线来避免与 Python 关键字冲突,如下所示:

single_trailing_underscore_

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

【讨论】:

  • 只是为了补充,当您不关心返回值时,有时会使用一个孤立的下划线_,通常是在解压缩具有多个值的元组时。
猜你喜欢
  • 2013-07-16
  • 1970-01-01
  • 2018-10-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多