Неожиданная распаковка кортежа, возможная проблема с областью видимости / путаница - PullRequest
0 голосов
/ 21 февраля 2019

Я использую Python 3.6.

Я действительно смущен распаковкой в ​​строках 09 и 10. Я ожидаю, что dy_outer в строке 09 будет равно (0, -1), а dy_inner в строке 09 будет равно (сторона-1,0).Точно так же я ожидаю, что dx_outer и dx_inner в строке 10 будут равны (0, -1) и (side-1, 0) соответственно.

Однако, когда set_trace отключается, вместо этого я вижу, что значения dy_outer и dy_inner из строки 09 равны 0 и -1 соответственно.И то же самое относится к dx_outer и dx_inner из строки 10;они также равны 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 голосов
/ 21 февраля 2019

Тайна состоит из трех частей.Во-первых, структура смещений представляет собой двумерный массив:

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

Надеюсь, что это устранит загадку из загадки, внутри загадки: -)

...