意外的元组解包,可能的范围 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_outer
和 dx_inner
分别等于 (0, -1) 和 (side-1, 0)。
然而,当 set_trace 熄灭时,我看到第 09 行的 dy_outer
和 dy_inner
的值分别等于 0 和 -1。第 10 行的 dx_outer
和 dx_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
希望这能解开谜团,解开谜团:-)
我正在使用 python 3.6。
我真的对第 09 行和第 10 行的解包感到困惑。我希望第 09 行的 dy_outer
等于 (0, -1),第 09 行的 dy_inner
等于 (side -1, 0).同样,我希望第 10 行的 dx_outer
和 dx_inner
分别等于 (0, -1) 和 (side-1, 0)。
然而,当 set_trace 熄灭时,我看到第 09 行的 dy_outer
和 dy_inner
的值分别等于 0 和 -1。第 10 行的 dx_outer
和 dx_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
希望这能解开谜团,解开谜团:-)