Вот список-преобразование, преобразованное в обычный for-l oop, если это поможет вам понять:
def product_nocomp(*args):
pools = map(tuple, args)
result = [[]]
for pool in pools:
_temp = []
for x in result:
for y in pool:
_temp.append(x + [y])
result = _temp
for prod in result:
yield tuple(prod)
А вот некоторые светящиеся print
:
In [9]: def product_nocomp(*args):
...: pools = list(map(tuple, args))
...: result = [[]]
...: print("Pools: ", pools)
...: for pool in pools:
...: print(result, end=' | ')
...: _temp = []
...: for x in result:
...: for y in pool:
...: _temp.append(x + [y])
...: result = _temp
...: print(result)
...: for prod in result:
...: yield tuple(prod)
...:
In [10]: list(product_nocomp(range(2), range(2)))
Pools: [(0, 1), (0, 1)]
[[]] | [[0], [1]]
[[0], [1]] | [[0, 0], [0, 1], [1, 0], [1, 1]]
Out[10]: [(0, 0), (0, 1), (1, 0), (1, 1)]
Таким образом, для каждого кортежа в пуле он проходит через каждый подсписок в промежуточном результате и добавляет каждый элемент в подсписок для каждого элемента в текущем пуле. Обратите внимание, что создает новые списки .