【问题标题】:Python built-in type as function parameter [duplicate]Python内置类型作为函数参数[重复]
【发布时间】:2014-02-06 03:31:42
【问题描述】:

我决定在 coderbyte.com 上做一些编码练习,在第一个练习中(反转字符串)我发现了这个:

def FirstReverse(str): 

尽管它有效,但我认为使用内置类型名称作为参数并不是一个好主意。你怎么看? 我知道这有点傻,但这是我在 stackoverflow 上的第一个问题!谢谢=)

【问题讨论】:

  • 这不是一个好主意,但只要你不在函数内使用str...

标签: python


【解决方案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

这是一个很常见的错误,你越早学会避免它,你就越早成为一名优秀的程序员。

【讨论】:

  • 投了你一票。答案对我来说似乎很清楚。
  • 声明 您将无法再次将 str() 作为函数调用 是完全错误的。您将无法从f 内部调用str。它是一个局部变量。并不是说str 的使用得到了认可——只是你的答案是错误的——我投了反对票。如果纠正,我会反转。 :-)
  • @dawg 已编辑。但是您所说的str 的使用得到认可”是什么意思??我不是以英语为母语的人,我找不到“认可”的合适翻译。
  • 我说“ str的使用得到认可”。如 -- 不要在函数中使用str 作为参数名... 否决票反转...
【解决方案2】:

可以使用除关键字之外的“任何东西”作为变量/参数名称。

但这通常不是一个好主意 - 实际上从来没有。


也许这个例子来自 Python1 系列,其中有一个字符串模块,但没有 str 类型。

【讨论】:

    【解决方案3】:

    使用listdictstr 作为变量名是一个常见的新手“错误”。

    我认为这对于教程来说不是一个好的做法,但在实践中效果很好在这个例子中。但是,如果向我提供带有该参数名称的代码,我会皱眉。

    要探索的更有趣的事情是为什么这不影响内置的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 内部。在完成f 的范围后,它会“恢复”到内置的str

    注意:

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

    由于您在f 内调用int,因此您指的是参数,而不是函数。这会让人感到困惑,因此,使用内置名称作为变量、参数等(无论是本地的还是全局的)都不是一个好主意。

    【讨论】:

      【解决方案4】:

      我不是拒绝克里斯蒂安的答案的人,但如果有帮助,这里有一个详细说明:

      工作功能

      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
      类'int' 类'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' 对象不可调用

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-04-01
        • 2020-01-28
        • 1970-01-01
        • 2016-01-29
        • 2018-08-27
        • 1970-01-01
        • 1970-01-01
        • 2019-05-08
        相关资源
        最近更新 更多