1

非常に単純な質問ですが、それは私にとって好奇心です...

文字列であるアイテムのリストがあるとします。リスト内の各要素で組み込み関数を呼び出すとstr、アイテムが既に文字列であるため、冗長に見えます。具体的にはPythonの場合ですが、他の言語にも興味があります。インタプリタは、アイテムが文字列であることをすでに認識していて、str関数を呼び出さないでしょうか? または、とにかくそれを実行して文字列を返しますか?また、文字列の文字列は何を意味しますか?

4

4 に答える 4

2

str文字列オブジェクトを呼び出すと、基になる関数__str__(self)が実行されます。元のオブジェクト (Python 文字列の場合) を返すかコピーを返すかは、関数の実装によって異なります。

一般的に言えば、言語は冗長な呼び出しを処理しないか、ほとんど処理しないと思います。プログラム自体が動作を決定します。(つまり、名前付き関数がオブジェクトに定義されているかどうか。定義されていない場合はエラーが発行されます。)

別の方法を考えてみましょう。C++ についてある程度の知識がある場合、C++ には一種のコピー コンストラクターがあります。同様に、実装に依存するディープ コピーとシャドウ コピーの問題に直面します。

于 2013-06-06T12:48:44.720 に答える
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.
于 2013-06-06T12:41:48.363 に答える
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__は、それがすでにクラスのインスタンスであるかどうかです (そうであれば、そのまま返すだけです)...

于 2013-06-06T12:48:29.207 に答える