非常简单的问题,但这对我来说是个好奇心......
假设我们有一个字符串项目列表。如果我们在列表中的每个元素上调用内置函数str
,那么这似乎是多余的,因为这些项已经是字符串。会幕后会发生什么,特别是对于Python,但对其他语言感兴趣。解释器是否已经看到该项是字符串而不是调用str
函数?或者无论如何都会这样做并返回一个字符串,字符串的字符串是什么意思?
答案 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__
中检查的第一件事通常是它是否已经是该类的实例(如果是这样,只是按原样返回)...