Почему Online Python Tutor представляет это неизменное целое число в виде двух разных целых чисел графически? - PullRequest
3 голосов
/ 15 октября 2019

В Fluent Python, Лучано Рамальо, глава 8, Копии по умолчанию мелкие, есть пример:

>>> listOne = [3, [55, 44], (7, 8, 9)]
>>> listTwo = list(listOne)
>>> listTwo
[3, [55, 44], (7, 8, 9)]
>>> listTwo == listOne
True
>>> listTwo is listOne
False

Автор предлагает нам пройти через этот код, используя Online Python Tutor, чтобы увидетьчто происходит шаг за шагом.

Я выполнил первые две строки, используя Online Python Tutor, и вот такой снимок экрана:

enter image description here

Что меня смущаетis:

Все три элемента из каждого списка, неизменное целое число, список и кортеж на самом деле одинаковы, например,

listOne[0] is listTwo[0] #True
listOne[1] is listTwo[1] #True
listOne[2] is listTwo[2] #True

Так почему на графике показаны две отдельные 3 наначало их соответствующего списка?

Ответы [ 2 ]

3 голосов
/ 15 октября 2019

Разработчики OnlinePythonTutor приняли это решение, задокументированное под Неподдерживаемые функции , потому что это не гарантированная языковая функция, а вместо этого зависит от реализации:

Python

для строк и чисел, вы не можете полагаться на поведение id() или is соответствия CPython на вашем компьютере;обучая новичков, вы не должны полагаться на эти варианты поведения, поскольку они являются специфичными для реализации оптимизациями. подробности см. в разделе «Проблемы с GitHub» здесь и здесь и здесь

Вы можете увидеть, как в issue 255 поведение, которое раньше было разным для целых чисел, даже вне диапазона от -5 до 256.

0 голосов
/ 15 октября 2019

Это CPython оптимизация . Этого не может быть в других реализациях Python.

x = 256
x is 256 # True
x = 257
x is 257 # False
...