Changing a bit the ordering of the output, so that it is the same on all levels:
def thing (length, depth, prefix = None):
if not depth: return
if not prefix: prefix = []
for l in range (length):
r = prefix + ['a[{}]'.format (l) ]
yield '.'.join (r)
for r in thing (length, depth - 1, r):
yield r
for x in thing (2, 3): print (x)
Output is:
a[0]
a[0].a[0]
a[0].a[0].a[0]
a[0].a[0].a[1]
a[0].a[1]
a[0].a[1].a[0]
a[0].a[1].a[1]
a[1]
a[1].a[0]
a[1].a[0].a[0]
a[1].a[0].a[1]
a[1].a[1]
a[1].a[1].a[0]
a[1].a[1].a[1]