Неопределенное поведение в Python - PullRequest
2 голосов
/ 09 мая 2020

Какое неопределенное поведение имеет Python? Неопределенное значение отсутствует в спецификации языка. Единственный известный мне пример - это изменение последовательности при ее повторении. До того, как узнать об этом, я думал, что Python не имеет неопределенного поведения, поэтому я предполагаю, что это крайне редко.

1 Ответ

3 голосов
/ 09 мая 2020

Вот два:

  • Сборка мусора
  • Упорядоченные словари в Python 3,6

Я бы сказал, что сборка мусора падает в эту категорию. Основная реализация Python (например, CPython) использует подсчет ссылок для сборки мусора, но это не требуется языком spe c.

Кроме того, вы не может полагаться на то, что переменная будет собрана мусором (и, следовательно, «очищена») в любой конкретной точке Python.

Учтите это:

f = open("file.txt").read()

Это довольно часто встречается в новых to- python и кажется достаточно безопасным, но явного вызова .close() для открытого файлового объекта нет. Когда объект уничтожается, неявно вызывается .close(). Из-за того, как работает CPython, он почти всегда своевременно уничтожается, и на практике это нормально. Но для других интерпретаторов python это может быть не так, и вы можете столкнуться с зависшими файловыми объектами. Вот почему вы всегда видите, что люди говорят, что безопаснее делать

with open("file.txt") as fl:
   f = fl.read()

, потому что теперь закрытие объекта не только явное, но и гарантированно произойдет в определенной строке кода.


В Python 3.6 словари заказывались как в деталях реализации в CPython. Это не было предписано SPE c, но люди начали полагаться на это неопределенное поведение, которое вызывало бы проблемы у пользователей других python интерпретаторов, поэтому в Python 3.7 они сделали упорядоченные словари частью spe c .

...