"""任务 2 · 默认值只在定义时算一次

两件事：
  A. 默认值在 def 那一行就定死了，之后改全局变量也影响不到它；
  B. 默认值是列表（可变对象）时，所有没给这个实参的调用共用同一个列表。

带 print 的行是判分接口，别改；要写的是三个 TODO 里的函数。
B 段是「调用一次、立刻打印一次」——叠加的过程才看得见；
三次都调用完再一起打印的话，三个名字打出的是同一个列表。

跑： py task2_default_arg.py
判： py run_tests.py
"""

# ══ A · 默认值只算一次 ═════════════════════════════════════
i = 5


# ══ TODO 1 ═════════════════════════════════════════════════
# 写 show_default(arg=i)：把 arg 交回调用处。
# 注意：默认值要写成 arg=i（读到定义那一行时的 i），不要写成别的值。
def show_default(arg=0):
    return 0


i = 6                                     # 这一行别改：改完再调用一次
print('A 默认值', show_default())          # 这行别改：期望 5，不是 6


# ══ B · 默认值是列表时 ═════════════════════════════════════
# ══ TODO 2 ═════════════════════════════════════════════════
# 写 grow_bad(a, L=[])：把 a 追加进 L，再把 L 交回调用处。
# 这一版故意留着课件里的陷阱，照课件原样写。
def grow_bad(a, L=[]):
    return L


# ══ TODO 3 ═════════════════════════════════════════════════
# 写 grow_ok(a, L=None)：先判 L 是不是 None，是就新建一个空列表，
# 再把 a 追加进去、把 L 交回调用处。
# 提示：判 None 用 L is None；调用处给进来的现成列表要接着用，别丢掉。
def grow_ok(a, L=None):
    return L


b1 = grow_bad(1)
print('B 陷阱版 第 1 次', b1)              # 这行别改：期望 [1]
b2 = grow_bad(2)
print('B 陷阱版 第 2 次', b2)              # 这行别改：期望 [1, 2]
b3 = grow_bad(3)
print('B 陷阱版 第 3 次', b3)              # 这行别改：期望 [1, 2, 3]
print('B 陷阱版是同一个列表', b1 is b2)      # 这行别改：期望 True
print('B 陷阱版 b1 现在', b1)               # 这行别改：期望 [1, 2, 3]

g1 = grow_ok(1)
g2 = grow_ok(2)
g3 = grow_ok(3)
print('B 修好版', g1, g2, g3)              # 这行别改：期望 [1] [2] [3]
print('B 修好版是同一个列表', g1 is g2)      # 这行别改：期望 False

extra = [7]
g4 = grow_ok(8, extra)
print('B 修好版接现成列表', g4, extra)       # 这行别改：期望 [7, 8] [7, 8]
