python 3.6.4で以下のコードを作成しました。

class Number(object):
    list = []
    def extend(self,arg):
        self.list.extend(arg.list)

def multi(arg):
    cls = Number()
    tmp = []

    file = open('data.txt', 'r')
    for line in file:
        tmp.append(int(line))
    file.close
    print(tmp)

    file = open('data.txt', 'w')
    file.write('')
    file.close

    for item in tmp:
        cls.extend(multi(item))

    cls.list.append(arg)
    print ('arg:',arg,' cls.list:',cls.list," id of cls:",id(cls))
    return cls

def main():
    ans = multi(5)
    print('ans.list:',ans.list)

if __name__ == '__main__':
    main()

そして、data.txtには以下のデータを保存しておきます。

5
4
3
2
1

このコードへ期待する動作は、
ans.listが[5,4,3,2,1]となっていることでした。
しかし、実際は再帰呼び出しされたclsのidがすべて同じため、
ans.listは期待とは違った値となっています。
なぜclsのidは再帰呼び出しされても同じidのままなのでしょうか。

例えば以下のコードでは、再帰呼び出しされたクラスのidはすべて異なっており、
期待通りの動作をします。

class Number(object):
    num = 5

def multi(arg):
    num_cls = Number()
    if arg > 1:
        num_cls.num = arg * multi(arg - 1)
    else:
        num_cls.num = 1
    print ('arg:',arg,' num:',num_cls.num," id of num_cls:",id(num_cls))
    return num_cls.num

def main():
    ans = multi(5)
    print (ans)

if __name__ == '__main__':
    main()

pythonのどの仕様がそうさせているのか、お伺いできればと思います。