1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
# === Parameter shadows outer local (basic) ===
def outer_basic():
x = 42
def inner(x):
return x + 1
return inner(10)
assert outer_basic() == 11
# === Parameter shadows outer local (multiple params) ===
def outer_multi():
a = 100
b = 200
def inner(a, b):
return a + b
return inner(1, 2)
assert outer_multi() == 3
# === Mixed: one param shadows, one captures ===
def outer_mixed():
x = 10
y = 20
def inner(x):
return x + y
return inner(5)
assert outer_mixed() == 25
# === Parameter shadows with default value ===
def outer_default():
x = 99
def inner(x=7):
return x
return inner()
assert outer_default() == 7
# === Deeply nested: param shadows grandparent local ===
def outer_deep():
x = 1000
def middle():
def inner(x):
return x * 2
return inner(3)
return middle()
assert outer_deep() == 6
# === Parameter used in complex expression ===
def outer_expr():
scale = 100
def inner(n, scale):
return n * scale + 1
return inner(5, 10)
assert outer_expr() == 51