Переменная c не проходит, потому что вы не передаете ссылку на c функции incrementc.
Здесь вы видите 3 области видимости, глобальную область видимости и области внутри функций main и incrementc. В основном вы правильно определили переменную c, но приращение c не знает об этом - поэтому попытка приращения приведет к провалу. Даже если эти две функции завершатся успешно, попытка напечатать c потерпит неудачу в глобальной области видимости, поскольку она не знает о c, который вы определили в main.
У вас есть несколько вариантов. Один из способов сделать это:
def incrementc(c):
c = c + 1
return c
def main():
c = 5
c = incrementc(c)
return c
c = main()
print c
Обратите внимание на то, как раздается С. Конечно, имя не нужно сохранять, вы очень хорошо могли бы написать его так:
def increment(z):
z = z + 1
return z
def main():
bar = 5
bar = increment(bar)
return bar
foo = main()
print foo
Другим вариантом, который многим, вероятно, не понравится (по уважительной причине), является использование глобальных переменных. В этом случае:
def incrementc():
global c # indicate intention to write to this global, not just read it
c = c + 1
def main():
global c # declares c in global space
c = 5
incrementc()
main()
print c
Любая функция, в которой вы надеетесь изменить глобальный экземпляр c, вам нужно сообщить об этой функции. Итак, вы заявляете, «глобальный с». Вы можете ПРОЧИТАТЬ из глобального без этого. Это позволит (в некоторой степени) избежать ошибки и непреднамеренно перезаписать значение в глобальном пространстве аналогичным именем, если вы решите использовать его в локальном пространстве функции.
Надеюсь, это достаточно ясно, но не стесняйтесь просить разъяснений по любому вопросу (я также открыт для исправления, если я ошибочно описал любую часть этого).