意外的元组拆包,可能的范围问题/混乱

问题描述 投票:4回答:1

我正在使用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
python-3.x scope iterable-unpacking
1个回答
6
投票

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

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

希望这能让谜语脱离神秘,在一个谜内:-)

© www.soinside.com 2019 - 2024. All rights reserved.