Причина, по которой ваш код «провалился», заключалась в том, что когда вы меняли значение имен [1], вы по существу меняли значения внутри комбо. Ради этого ответа я разделю ваш список имен на имена [0] и имена [1]
Когда вы добавляли комбо, в псевдо-коде вы писали его как
combos.append([names[0], names[1]])
Списки - это набор смежных указателей. Если у вас есть список размером 10, у вас есть 10 указателей (которые указывают на значение). Не имеет смысла отправлять указатель куда-либо, поскольку он аккуратно хранится в последовательном порядке. Поэтому, когда вы изменяете значение слота в списке, вы просто меняете переменную, на которую указывает указатель.
Когда вы добавляли имена [1] в список, вы давали ему «указатель». Что дает:
combos = ([[names[0], names[1]], [names[0], names[1]], ...., [names[0], names[1]]])
Чтобы избежать передачи указателей в комбо, вы можете просто передать переменную. Переменные ни на что не указывают, поэтому, когда вы меняете переменную, вы изменяете саму переменную, а не весь список комбо.
names = ['Appleby', 'James']
nn = ['James', 'Jim', 'Jimmy', 'Jimmie', 'Jamie', 'Jem']
combos = []
for g in nn:
combos.append([name[0],g])
print(combos)