Почему значение переменной изменилось? И почему не изменилось?
В первом случае передается значение скалярной переменной. И ее изменение остается в рамках функции.
Во втором случае передается список, который является фактически ссылкой.
В таких языках как С есть явное и однозначное управление тем что передается в функцию. Если хотите чтобы значение в функции менялось - передавайте ссылку на значение, не хотите изменений - передавайте само значение. Правда и внутри таких двух функций надо использовать разные нотации для доступа к таким переменным. 
В Python все немного упрощено, и поэтому возникают такие неоднозначности. В нем к примеру значение 1 у всех переменных, которые это значением имеют, хранится в одном и том же месте. Но вот значение 30000 в одной переменной и то же значение 30000 в другой, будут хранится в разных местах.
Есть еще много всяких нюансов проистекающих из упрощений Python-а.
Потому что функция не сохраняет значение, а только возвращает.
Для того, чтобы переменная изменилась, надо написать так:x = 15
def ne_pridumal_kak_nazvat(chislo):
    chislo += 1
    return chislo # возвращаем значение
x = ne_pridumal_kak_nazvat(x)
print(x) # 16
или так (не рекомендуется)x = 15
def ne_pridumal_kak_nazvat():
    global x
    x += 1
ne_pridumal_kak_nazvat()
print(x) # 16
В первом случае мы передаем в функцию число x = 15, прибавляем к нему 1, возвращаем полученное число и записываем как новый x.
Во втором случае мы создаем глобальную переменную x (то есть она доступна как в функции, так и вне нее), поэтому все изменения, которые мы будем делать отразятся на x (еще раз повторю: крайне не рекомендую использовать глобальные переменные).
Во второй функции со списком мы передаем список и добавляем к нему значение, а не формируем список с (элементы прошлого списка) + (еще элемент), поэтому все изменения, опять же, отразятся на списке.