Коли запущений модуль Python (файл .py), оператори верхнього рівня в ньому виконуються в тому порядку, в якому вони з'являються, зверху вниз (від початку до кінця). Це означає, що ви не можете посилатися на щось, поки не визначите. Наприклад, наступне генерує показану помилку:
c = a + b
a = 13
b = 17
На відміну від багатьох інших мов, def
а class
оператори виконуються у Python, а не лише декларативні, тому ви не можете посилатися ні на те, a
ні b
до того, поки це не відбудеться, і вони не будуть визначені. Ось чому ваш перший приклад має проблеми - ви посилаєтесь на Kerma()
функцію до того, як її def
оператор виконано, а тіло оброблено, а отриманий об'єкт функції прив'язаний до імені функції, тому він не визначений на той момент у сценарії.
Програми такими мовами, як C ++, зазвичай попередньо обробляються перед запуском, і на цьому етапі компіляції вся програма та будь-які #include
файли, на які вона посилається, читаються та обробляються одночасно. На відміну від Python, ця мова має декларативні оператори, які дозволяють оголошувати (але не визначати) ім'я та послідовність викликів функцій (або статичний тип змінних) перед використанням, так що, коли компілятор зустрічає їх ім'я, він має достатньо інформації для перевірки їх використання, яке в першу чергу передбачає перевірку типу та перетворення типів, жодне з яких не вимагає, щоб їх фактичний вміст або тіло коду ще були визначені.