非常に単純な質問ですが、それは私にとって好奇心です...
文字列であるアイテムのリストがあるとします。リスト内の各要素で組み込み関数を呼び出すとstr
、アイテムが既に文字列であるため、冗長に見えます。具体的にはPythonの場合ですが、他の言語にも興味があります。インタプリタは、アイテムが文字列であることをすでに認識していて、str
関数を呼び出さないでしょうか? または、とにかくそれを実行して文字列を返しますか?また、文字列の文字列は何を意味しますか?
非常に単純な質問ですが、それは私にとって好奇心です...
文字列であるアイテムのリストがあるとします。リスト内の各要素で組み込み関数を呼び出すとstr
、アイテムが既に文字列であるため、冗長に見えます。具体的にはPythonの場合ですが、他の言語にも興味があります。インタプリタは、アイテムが文字列であることをすでに認識していて、str
関数を呼び出さないでしょうか? または、とにかくそれを実行して文字列を返しますか?また、文字列の文字列は何を意味しますか?
str
文字列オブジェクトを呼び出すと、基になる関数__str__(self)
が実行されます。元のオブジェクト (Python 文字列の場合) を返すかコピーを返すかは、関数の実装によって異なります。
一般的に言えば、言語は冗長な呼び出しを処理しないか、ほとんど処理しないと思います。プログラム自体が動作を決定します。(つまり、名前付き関数がオブジェクトに定義されているかどうか。定義されていない場合はエラーが発行されます。)
別の方法を考えてみましょう。C++ についてある程度の知識がある場合、C++ には一種のコピー コンストラクターがあります。同様に、実装に依存するディープ コピーとシャドウ コピーの問題に直面します。
データ型が不変で、既に同じ型である場合、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.
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__
は、それがすでにクラスのインスタンスであるかどうかです (そうであれば、そのまま返すだけです)...