Все дело в том, что в команде print параметр sep по умолчанию равен пробелу
sep = ' ', а параметр end по умолчанию равен переносу строки
end = '\n'
В цикле вы вызываете команду print несколько раз, и каждый раз срабатывают оба параметра по умолчанию.
То есть вот этот код:
spisok = [1, 2, '3']
for x in spisok:
print(x)
Равносилен вот этому:
spisok = [1, 2, '3']
for x in spisok:
print(x, sep = ' ', end = '\n')
Если не указывается параметр команды print и значение этого параметра, то он назначается по умолчанию.
То, что вы пытаетесь заставить сделать параметр sep на самом деле управляется параметром end. Так как параметр sep работает когда в команде print несколько аргументов, а у нас всего один. Циклом повторяется не аргумент внутри print, а весь print целиком. То есть каждый print вам будет переносить строку. Поэтому и вылезает перенос строки в выводе вот тут, а
sep не срабатывает:
print(x, sep=", ")
output:
1
2
3
Вот тут значение параметра end перестало быть переносом строки, поэтому аргумент выведен в одну строку x раз, но так как аргумент всего один, sep не срабатывает, он просто не нужен, команде print нечего перечислять.
print(x, end=" ", sep=", ")
output:
1 2 3
В итоге несложно догадаться, что значение ', ' надо передавать в параметр end (правда последний аргумент тоже выведется с запятой, т.к. end будет для него тоже срабатывать):
print(x, end=", ")
output:
1, 2, 3,