冗余函数调用会发生什么?

时间:2013-06-06 12:37:07

标签: python

非常简单的问题,但这对我来说是个好奇心......

假设我们有一个字符串项目列表。如果我们在列表中的每个元素上调用内置函数str,那么这似乎是多余的,因为这些项已经是字符串。会幕后会发生什么,特别是对于Python,但对其他语言感兴趣。解释器是否已经看到该项是字符串而不是调用str函数?或者无论如何都会这样做并返回一个字符串,字符串的字符串是什么意思?

4 个答案:

答案 0 :(得分:3)

测试很简单:

>>> a = 'a'
>>> id(a)
4298835424
>>> id(str(a))
4298835424
>>> a is str(a)
True

这是完全相同的对象。

测试并使用CPython 2.7。,3.3。,PyP 1.9。,IronPython 2.0

NOT 是否适用于Jython 2.5:

Jython 2.5.2 (Release_2_5_2:7206, Mar 2 2011, 23:12:06) 
[Java HotSpot(TM) 64-Bit Server VM (Apple Inc.)] on java1.6.0_45
Type "help", "copyright", "credits" or "license" for more information.
>>> a = 'a'
>>> id(a)
2
>>> id(str(a))
3
>>> id(str(a))
4
>>> a is str(a)
False     

答案 1 :(得分:2)

在字符串对象上调用str时,将执行基础函数__str__(self)。是否返回原始对象(python字符串case)或副本取决于函数的实现。

一般来说,我认为这种语言对于处理多余的电话不会做或做得很少。程序本身将决定行为。 (即,是否在对象上定义了命名函数,如果不是,则会发出错误。)

让我们以另一种方式思考。如果您对C ++有一些了解,那么在C ++中就有一种复制构造函数。它同样面临着依赖于您的实现的深层复制和卷影复制问题。

答案 2 :(得分:1)

如果数据类型是不可变的并且已经是相同的类型,那么Python只返回原始数据,例如与元组相同。

>>> help(str)
Help on class str in module __builtin__:

class str(basestring)
 |  str(object='') -> string
 |  
 |  Return a nice string representation of the object.
 |  If the argument is a string, the return value is the same object.

答案 3 :(得分:1)

Python调用str

dis.dis(compile("str('a')", '<none>', 'eval'))
  1           0 LOAD_NAME                0 (str)
              3 LOAD_CONST               0 ('a')
              6 CALL_FUNCTION            1
              9 RETURN_VALUE

但这只返回相同的字符串:

In [11]: str('a') is 'a'
Out[11]: True

在课程__init__中检查的第一件事通常是它是否已经是该类的实例(如果是这样,只是按原样返回)...