14

Python のprintステートメントは通常repr()、その入力の を出力するようです。タプルは例外ではないようです:

>>> print (1, 2, 3)
(1, 2, 3)
>>> print repr((1, 2, 3))
(1, 2, 3)

しかし、その後、CPython の内部をいじっているときに、いくつかの奇妙な動作に出くわしました。要するに、Python 2 をだまして自己参照タプルを作成させた場合、それを直接印刷することは、repr()//表現を印刷することとはまったく異なる動作をします。str()unicode()

>>> print outer   # refer to the link above
((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((
((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((
... many lines later ...
((((((((((Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
MemoryError: stack overflow
>>> print repr(outer)
((...),)
>>> print str(outer)
((...),)
>>> print unicode(outer)
((...),)

では、正確には何をしているのprintでしょうか。この質問に自分で答えようとして、言語リファレンスを参照しました。

6.6. printステートメント_

print各式を順番に評価し、結果のオブジェクトを標準出力に書き込みます (以下を参照)。オブジェクトが文字列でない場合、最初に文字列変換の規則を使用して文字列に変換されます。

文字列変換の規則は次のとおりです。

5.2.9. 文字列変換

文字列変換は、逆引用符 (逆引用符) で囲まれた式リストです。

string_conversion ::=  "`" expression_list "`"

しかし、逆引用符で囲むと、電話や友達とouter同じ結果になります。repr()サイコロはありません。printでは、舞台裏で実際に何をしているのでしょうか。

(興味深いことに、この動作は Python 3 で「修正」されています。自己参照タプルを出力すると、省略記号で切り捨てられた形式になります。)

4

1 に答える 1