>>> str = 'Hello world!'
>>> print str
Hello world!
str(str)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'str' object is not callable
编辑:
下面是一个简单的演示:
def salut():
str = 'Hello world!'
return str
if __name__ == '__main__':
s = salut()
print str(s) #nothing prevents you from using 'str' outside 'salut()'
This seems to work, even though str is a built in function and shouldn't be used as a variable.
是的,那是真的。Python不会阻止你射中自己的脚。作为开发人员,您需要确保不覆盖内置名称。
What is actually happening here? My guess is str will no longer be usable as a function, but only in the scope of the blah() function he's written. Is that correct? This won't redefine str globally, right?
在您的例子中,
str
只是一个变量,没有什么可以阻止您在该函数之外使用str()
:编辑:
下面是一个简单的演示:
在内部,函数的局部变量表将包含一个
str
项,该项将是该函数的本地项。您仍然可以通过在Py3中执行builtins.str
和在Py2中执行__builtin__.str
来访问函数中的内置类。函数外部的任何代码都看不到函数的任何局部变量,因此内置类可以安全地在其他地方使用。这里还有另一个警告/角落案例,在this question中描述。本地表项是在编译时创建的,而不是在运行时创建的,因此即使在将
"asdf asdf asdf"
分配给它之前,也不能在函数中使用str
的全局定义:将以
UnboundLocalError
失败。是的,那是真的。Python不会阻止你射中自己的脚。作为开发人员,您需要确保不覆盖内置名称。
你在这里也有一部分是正确的。如果
str
的值被本地覆盖,则仅影响当前作用域。str
的全局值保持不变。但是,如果str
在全局作用域中被重写,那么它将影响所有子作用域。这背后的原因是Python解释器如何在运行时编译值。可以使用一个简单的示例来观察此行为:第一个示例有效,因为
str
只在foo()
的范围内被覆盖。但是,第二个示例失败,因为str
被全局覆盖:不过,您始终可以导入
builtins
(__builtins__
在Python 2中),并将str
的值重置为其原始含义:另外,正如@Brad Solomon所说,您可以简单地使用
del str
来恢复内置的str
值:相关问题 更多 >
编程相关推荐