回答:
>>> x = 'foo'
>>> x
'foo'
したがって、名前xは'foo'文字列に付加されます。たとえばを呼び出すとrepr(x)、インタープリターはの'foo'代わりにput をx呼び出し、次にを呼び出しますrepr('foo')。
>>> repr(x)
"'foo'"
>>> x.__repr__()
"'foo'"
repr実際にの魔法のメソッド__repr__を呼び出しますx。これは、に割り当てられた値の表現を含む文字列を提供します。そのため、結果として文字列内に戻ります。のアイデアは、インタプリタに入力できる一連のシンボルを含む文字列を与え、引数として送信されたのと同じ値を取得することです。'foo'x'foo'"""'foo'"reprrepr
>>> eval("'foo'")
'foo'
を呼び出すとeval("'foo'")、'foo'インタープリターに入力するのと同じになります。それ""は、インタプリタで外側の文字列の内容を直接入力するためです。
>>> eval('foo')
Traceback (most recent call last):
File "<pyshell#5>", line 1, in <module>
eval('foo')
File "<string>", line 1, in <module>
NameError: name 'foo' is not defined
を呼び出すとeval('foo')、fooインタプリタに入力するのと同じになります。ただしfoo、使用可能な変数はなく、例外が発生します。
>>> str(x)
'foo'
>>> x.__str__()
'foo'
>>>
strオブジェクトの単なる文字列表現です(x変数はを参照すること'foo'に注意してください)。したがって、この関数は文字列を返します。
>>> str(5)
'5'
整数の文字列表現は5です'5'。
>>> str('foo')
'foo'
そして、文字列の文字列表現は'foo'同じ文字列'foo'です。
インタラクティブインタープリターで得られるフィードバックも使用しreprます。式を入力すると(そうするexpr)、インタプリタは基本的にそうしresult = expr; if result is not None: print repr(result)ます。したがって、例の2行目では、文字列fooを目的の表現('foo')にフォーマットしています。そして、インタプリタは、作成reprのesentation それを二重引用符であなたを残して、。
%rを二重引用符と単一引用符のエスケープと組み合わせて出力すると、.pyファイルに書き込む方法で印刷されますが、見たい方法では印刷されないのはなぜですか?
ここで何を求めているのかわかりません。をsingle ' and double " quotes実行するとrepr、テキストには1種類の引用符のエスケープが含まれます。もちろんそうですが、そうでなければ、Pythonルールによる有効な文字列リテラルではありません。それはまさにあなたがを呼ぶことによって求めたものですrepr。
また、このeval(repr(x)) == x類推は文字通りではないことに注意してください。これは概算であり、ほとんど(すべて?)の組み込み型に当てはまりますが、主なことは、repr出力を見ると、型と論理的な「値」についてかなり良いアイデアが得られるということです。
reprに渡されるeval(またはソースコードにコピーして貼り付けられる)ものか、それを試行したときにSyntaxErrorを発生させるもののいずれかである必要があります(通常<…>によって生成スタイルobject.__repr__)。それは年々徐々に落ち着いてきました、そして2.7と3.xでそれはちょうど「多くのタイプに対して」真実であり、そしてstdlibでさえ例外があります(例えば、namedtupleローカルとして作成されたタイプはreprあなたにあなたに与えることができます ' t eval)、しかしそれは元のアイデアでした。
あなたが言う時
foo = 'bar'
baz(foo)
関数に渡っfooていませんbaz。 fooは値を表すために使用される単なる名前です(この場合'bar'は)baz。その値は関数に渡されます。