Оператор 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: печать кортежа, ссылающегося на себя, дает форму, усеченную многоточием.)
struct.error: 'I' format requires 0 <= number <= 4294967295
, когда попробовал ваш код. - person thefourtheye   schedule 21.12.2013c_outer[inner_index:inner_index+4] = struct.pack('Q', id(outer))
сValueError: Can only assign sequence of same size
- person thefourtheye   schedule 21.12.2013+4
на+8
. EDIT: я обновил связанный Gist, и теперь он должен работать как на 32-разрядных, так и на 64-разрядных платформах. - person ashastral   schedule 21.12.2013(
. - person thefourtheye   schedule 21.12.2013not to be fixed
в Python 2.http://bugs.python.org/issue1069092
- person Ned Deily   schedule 21.12.2013internal_print
(околоobject.c:315
иtupleprint
(околоtupleobject.c:253
). Проблема с рекурсивными представлениями контейнера была исправлена в Python 3.2: bugs.python.org/issue9840 - person Ned Deily   schedule 21.12.2013