意外的元组解包,可能的范围 issue/confusion

Unexpected tuple unpacking, possible scoping issue/confusion

我正在使用 python 3.6。

我真的对第 09 行和第 10 行的解包感到困惑。我希望第 09 行的 dy_outer 等于 (0, -1),第 09 行的 dy_inner 等于 (side -1, 0).同样,我希望第 10 行的 dx_outerdx_inner 分别等于 (0, -1) 和 (side-1, 0)。

然而,当 set_trace 熄灭时,我看到第 09 行的 dy_outerdy_inner 的值分别等于 0 和 -1。第 10 行的 dx_outerdx_inner 也是如此;它们也分别等于 0 和 -1。

offsets 是一个元组的元组,所以当你迭代它时,它应该解压每个元组,而不是第一个元组中的每个元素。

我对 Python 范围界定的直觉是不是不正确?

01 def cover(board, lab = 1, top = 0, left =0, side = None):
02    if side is None:
03        side = len(board)
04    
05    s = side // 2
06    
07    offsets = (0, -1), (side-1, 0)
08    
09    for dy_outer, dy_inner in offsets:
10        for dx_outer, dx_inner in offsets:
11            set_trace()
12            if not board[top+dy_outer][left+dx_outer]:
13                board[top + s + dy_inner][left+s+dx_inner] = lab
14    lab += 1
15    if s > 1:
16        for dy in [0,s]:
17            for dx in [0, s]:
18                lab = cover(board, lab, top+dy, left+dx, s)
19    return lab

谜团分为三个部分。首先,偏移量结构是一个二维数组:

((0, -1),
 (side-1, 0))

第二部分是 for 循环将只循环行:

>>> for row in offsets:
        print(row)

(0, -1)
(18, 0)

第三部分是拆包只是对给定行上的列进行拆包:

>>> for column_zero, column_one in offsets:
        print('Column 0:', column_zero)
        print('Column 1:', column_one)
        print()

Column 0: 0
Column 1: -1

Column 0: 18
Column 1: 0

将各个部分放在一起表明您的直觉是正确的:

print('dy_o', 'dy_i', 'dx_o', 'dx_i', sep='\t\t')
print('----', '----', '----', '----', sep='\t\t')
for dy_outer, dy_inner in offsets:
    for dx_outer, dx_inner in offsets:
        print(dy_outer, dy_inner, dx_outer, dx_inner, sep='\t\t')

给出预期的输出:

dy_o            dy_i            dx_o            dx_i
----            ----            ----            ----
0               -1              0               -1
0               -1              18              0
18              0               0               -1
18              0               18              0     

希望这能解开谜团,解开谜团:-)