意外的元组拆包,可能的作用域问题/混乱

时间:2019-02-21 06:31:14

标签: python-3.x scope iterable-unpacking

我正在使用python 3.6。

我对第9行和第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

1 个答案:

答案 0 :(得分:6)

这个谜分为三个部分。首先,offsets结构是一个二维数组:

((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     

希望这能揭开谜团中的谜团:-)