我决定在coderbyte.com做一些编码练习,然后在第一个练习中(反向一个字符串)我发现了这个:
def FirstReverse(str):
尽管它有效,但我认为使用内置类型名称作为参数并不是一个好主意。你怎么看? 我知道这有点傻,但这是我在stackoverflow的第一个问题!谢谢=)
答案 0 :(得分:1)
在该功能定义中,str
应该是string
,而不是built-in function str()
。执行此操作时,您将覆盖内置函数,因此将无法在函数str()
内调用f
,但您仍然可以使用它外。这是因为范围界定,您将在f
的本地范围内覆盖它:
def f(str):
print str(123) # will raise an error, because 'str' is not callable (i.e. a function) anymore
f("some string here")
print str(123) # OK
这是一个非常常见的错误,你越早学会避免它,你就越早成为一名优秀的程序员。
答案 1 :(得分:0)
你可以使用除“关键字”之外的“任何东西”作为变量/参数名称。
这通常不是一个好主意 - 实际上从来都不是。
也许这个例子来自Python1系列,其中有一个字符串模块,但没有str
类型。
答案 2 :(得分:0)
我不是那个投票支持克里斯蒂安答案的人,但如果它有所帮助,这里有一个详细说明:
def f(string):
print ("In function.")
print (string)
print (type(string))
real_string = str(string)
print (type(real_string))
print ("In main.")
int_val = 123
print (type(int_val))
f(int_val)
主要。
在功能上。
123个
class'int'
class'str'
def f(str):
print ("In function.")
print (str)
print (type(str))
real_string = str(str)
print (type(real_string))
print ("In main.")
int_val = 123
print (type(int_val))
f(int_val)
----> 5 real_string = str(str)
TypeError:'int'对象不可调用
答案 3 :(得分:0)
使用list
,dict
,str
作为变量名是一个常见的新错误'。
我认为这对于教程来说不是一个好习惯,但在实践中可以正常运行在此示例中。如果代码是用这个参数名称呈现给我的话,我会皱眉。
要探索的更有趣的事情是,为什么内置的str
函数不会出现此问题。
查找
>>> str(123) # the built-in prior to the function 'f' declared
'123'
>>> def f(str): # Note 'str' as parameter
... return str[::-1]
...
>>> f('123') # function works...
'321'
>>> f(str(123)) # function 'f' works with the function 'str' prior
'321'
>>> str(123) # built-in 'str' still works...
'123'
答案是f
str
参数仅在str
内部覆盖内置f
函数。在str
的范围完成后,它会“恢复”到内置f
。
注意:
>>> def f(str):
... return str('123')[::-1]
...
>>> f(123)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 2, in f
TypeError: 'int' object is not callable
由于您在int
内调用f
,因此您指的是参数,而不是函数。它变得令人困惑,因此,使用内置的名称作为变量,参数等无论是本地还是全局都不是一个好主意。