Почему присвоение значения двойному подчеркиванию __ нарушает поведение одиночного подчеркивания _ в ipython? - PullRequest
1 голос
/ 10 мая 2019

Я играл с системой кэширования вывода в IPython и заметил странное поведение, дающее неожиданные результаты при использовании единственного подчеркивания _ для получения предыдущего вывода.

Передзаписывая этот вопрос, я не знал о системе кэширования вывода, реализованной в IPython, и решил, что в качестве фиктивной переменной следует использовать двойное подчеркивание __, если я хочу использовать предыдущий вывод, обращаясь к специальной переменной _ -Variable.

Рассмотрим следующую сессию:

Python 3.6.7 (default, Oct 22 2018, 11:32:17) 
Type 'copyright', 'credits' or 'license' for more information
IPython 7.3.0 -- An enhanced Interactive Python. Type '?' for help.

In [1]: 2*3                                                                               
Out[1]: 6

In [2]: 4 + _  # expect 10, OK                                                            
Out[2]: 10

In [3]: __, something = 1, 2                                                              

In [4]: 3*3                                                                               
Out[4]: 9

In [5]: 3 + _  # expect 3+9=12, but:                                                      
Out[5]: 13

Как видно выше, после присвоения значения __ использование _ не дает ожидаемого результата.

После прочтения ссылок, связанных ранее, я знаю, что мне, вероятно, просто не стоит связываться с _, __ или ___.Может ли назначение одного из них просто заморозить все остальные?
Документация не намекает на эти проблемы.Кроме того, я нахожу это крайне нелогичным, поскольку обычная оболочка Python ведет себя по-разному.(После просмотра приведенного выше примера в обычной оболочке конечный результат будет таким, как и ожидалось!)

Заранее спасибо за ваш отзыв!

1 Ответ

3 голосов
/ 27 мая 2019

IPython имеет (среди прочего) 3 конкретные переменные: _, __ и ___, Каждый раз, когда вы выполняете казнь, они перемещаются; _ -> __, __ -> ___, ___ -> отброшено, а последний результат -> _

Если присваивается одна из этих переменных; тогда вращение останавливается.

In [1]: 1
Out[1]: 1

In [2]: 2  # _:1, __:'', ___:''
Out[2]: 2

In [3]: 3  # _:2, __:1, ___:'' 
Out[3]: 3

In [4]: ___ ='something', # _:3, __:2, ___:1

In [5]: __ # still gonna be 2
Out[5]: 2

In [6]: __ # still gonna be 2 again
Out[6]: 2

In [7]: _ # still 3
Out[7]: 3

Стоит обсудить, но это довольно сложно изменить; относительно трудно понять, что имеется в виду, и что пользователь «изменил» _, __ или ___;

В приведенном выше примере замените "something" на 1, и, поскольку (1 is 1) == True, тогда IPython не «обнаружит», что вы назначили одно из символов подчеркивания, и возобновит сдвиг.

...