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.
文字列変換の規則は次のとおりです。
5.2.9. 文字列変換
文字列変換は、逆引用符 (逆引用符) で囲まれた式リストです。
string_conversion ::= "`" expression_list "`"
しかし、逆引用符で囲むと、電話や友達とouter
同じ結果になります。repr()
サイコロはありません。print
では、舞台裏で実際に何をしているのでしょうか。
(興味深いことに、この動作は Python 3 で「修正」されています。自己参照タプルを出力すると、省略記号で切り捨てられた形式になります。)