Когда мы это делаем:
def foo(a=[]):
...
... мы присваиваем аргумент a
списку unnamed , если вызывающий объект не передает значение a .
Чтобы упростить эту дискуссию, давайте временно присвоим неназванному списку имя. Как насчет pavlo
?
def foo(a=pavlo):
...
В любое время, если вызывающий абонент не сообщает нам, что a
, мы повторно используем pavlo
.
Если pavlo
изменен (модифицируется), а foo
заканчивает его модификацию, эффект, который мы замечаем в следующий раз, foo
вызывается без указания a
.
Итак, это то, что вы видите (помните, pavlo
инициализируется в []):
>>> foo()
[5]
Теперь pavlo
- [5].
Вызов foo()
снова снова изменяет pavlo
:
>>> foo()
[5, 5]
Задание a
при вызове foo()
гарантирует, что pavlo
не коснулся.
>>> ivan = [1, 2, 3, 4]
>>> foo(a=ivan)
[1, 2, 3, 4, 5]
>>> ivan
[1, 2, 3, 4, 5]
Итак, pavlo
все еще [5, 5]
.
>>> foo()
[5, 5, 5]
open import Common.IO
open import Data.Nat using (ℕ; zero; suc)
open import Data.Integer using (ℤ; +_; show)
open import Data.String using (_++_)
_+_ : ℕ → ℕ → ℕ
zero + m = m
suc n + m = suc (n + m)
main = putStrLn ("Hello, world " ++ show (+ (3 + 4)) ++ "!")