dmitry1959
Результат выполнения функции здесь ведь зависит от параметра n, но тем не менее в объявлении функции он отсутствует. В других случаях применение параметров в объявлении функции необходимо.
Помогите пожалуйста разобраться - как определить , когда можно обойтись без параметров, а когда нет .
Есть глобальные переменные и есть локальные переменные. Когда делаешь функцию, у неё определяется локальная область видимости и глобальная область видимости. Глобальная область видимости находится за пределами функции, локальная область видимости находится в пределах функции. Когда делаешь переменные с одинаковыми именами, то в разных областях видимости это разные переменные.
Просто запусти этот код
n = 10
def f(n):
print(n)
n = 1
print(n)
n = 2
print(n)
print(n)
f(0)
print(n)
n = 20
print(n)
f(0)
print(n)
Получается такое
>>>
>>> n = 10
>>>
>>> def f(n):
... print(n)
... n = 1
... print(n)
... n = 2
... print(n)
...
>>> print(n)
10
>>> f(0)
0
1
2
>>> print(n)
10
>>>
>>> n = 20
>>>
>>> print(n)
20
>>> f(0)
0
1
2
>>> print(n)
20
>>>
Как видишь, глобальная переменная n и локальная переменная n - это две разные переменные, которые хранят разные значения и никак не относятся друг к другу.
Локальная переменная n в функции создаётся в заголовке функции
Как только переменная появилась в заголовке, значит создалась локальная переменная функции, которая существует только внутри функции и которая создаётся каждый раз при вызове функции и уничтожается каждый раз при завершении вызова функции.
Вызов функции выглядит так
Тут создалась переменная n внутри функции, этой переменной внутри функции присвоилось значение 0 и дальше функция работает и видит эту переменную внутри функции, а потом функция доходит до своей последней строки и переменная n внутри функции уничтожается.
При следующем вызове этой функции всё это повторяется заново.
Когда есть глобальная переменная, все функции её видят сразу.
Просто запусти этот код
n = 20
def g():
print(n)
print(n)
g()
print(n)
Получается такое
>>>
>>> n = 20
>>>
>>> def g():
... print(n)
...
>>> print(n)
20
>>> g()
20
>>> print(n)
20
>>>
Как видишь, переменная n создаётся только за пределами функции и функция просто к ней обращается внутри себя, потому что видит эту переменную в глобальной области видимости, а в локальной области видимости такой переменной нет. Если бы у функции в локальной области видимости создавалась бы локальная переменная n, то эта локальная переменная n перекрыла бы собой глобальную переменную n в этой функции и функция видела бы только локальную переменную n от начала вызова этой функции до конца вызова этой функции.
Есть ещё возможность менять в функции глобальную переменную.
Просто запусти этот код
n = 20
def h():
global n
print(n)
n = 30
print(n)
print(n)
h()
print(n)
Получается такое
>>>
>>> n = 20
>>>
>>> def h():
... global n
... print(n)
... n = 30
... print(n)
...
>>> print(n)
20
>>> h()
20
30
>>> print(n)
30
>>>
Как видишь, в функции объявлено специально, что переменная n глобальная, чтобы функция понимала, что внутри не нужно создавать локальную переменную n, а надо работать с глобальной переменной n только. Таким образом функция выводит глобальную переменную n и записывает новое значение в глобальную переменную n.
Если же сделать то же самое, но без объявления о глобальности n, то функция будет думать, что ты пытаешься создать внутри неё локальную переменную n.
Просто запусти этот код
n = 20
def h():
print(n)
n = 30
print(n)
print(n)
h()
print(n)
Получается такое
>>>
>>> n = 20
>>>
>>> def h():
... print(n)
... n = 30
... print(n)
...
>>> print(n)
20
>>> h()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 2, in h
UnboundLocalError: local variable 'n' referenced before assignment
>>> print(n)
20
>>>
Как видишь, функция пишет, что ты создал локальную переменную n внутри функции в строке n = 30 (она создалась автоматически из-за присваивания ей значения), но тут же она видит, что наверху стоит строка print(n), которая эту переменную пытается вывести до её создания, поэтому функция считает это ошибкой, так как локальную переменную нельзя вывести до её создания, и пишет об ошибке. Сообщение означает “ты пытаешься вывести на экран значение переменной, которую ещё не создал, а создаёшь её только в следующей строке - это ошибка”. Во время всего этого глобальная переменная n внутри функции никак не участвует, а живёт своей отдельной жизнью, почему print'ы за пределами вызова функции и продолжают выдавать двадцатки на экран.