2015-02-25 2 views
-2

Я просто играл с питоном и понял что-то странное.Python: две функции с тем же именем

У меня есть ниже функция:

def myfun(): #f1 
    return 1 
def myfun(): #f2 
    return 0 

print (myfun()) 

Я изменил значение в f1 и f2, но все же он всегда, кажется, печати возвращаемого значения f2. Есть ли конкретная причина?

+2

Вторая функция перезаписывает первую. –

+1

Декларация. –

+0

@AvinashRaj вы можете объяснить? –

ответ

3

В скомпилированных языках вы обычно получаете сообщение об ошибке, если попытаетесь определить две функции с тем же именем. Но в Python функции являются первоклассными объектами, и они определяются динамически.

Когда вы определяете новую функцию с тем же именем, что и ранее определенная функция, имя функции теперь привязано к новому объекту функции, а старый объект функции возвращен сборщиком мусора.

Итак, что происходит с вашими функциями, ничем не отличается от того, что происходит с простыми целыми примерами, размещенными в других ответах на этой странице.

Аналогично, мы можем сделать то же самое с функциями, определенными с использованием механизма lambda. Например:

>>> myfun=lambda:1; myfun=lambda:0; print(myfun()) 
0 
+0

Thx для объяснения :) –

0

Почему это странно? Второе отклонение функции отменяет первое, поэтому к моменту времени print существует только f2.

+0

есть причина, почему это происходит? thx :) –

+1

Вот как работает интерпретатор. предположим, что вы напишете 'a = 10', а затем' a = 20' в следующей строке. Что бы вы ожидали, что значение a будет после этих двух строк? – WeaselFox

+0

Я думаю, что вам следует сначала изучить некоторые проблемы ... тогда это будет более понятно для u – Tushar

0

Второе определение заставляет имя myfun привязываться к его функции, заменяя привязку, созданную предыдущим определением. Это точно так же, как и то, что происходит в:

a = 1 
a = 0 

print a 
+1

странный - тот самый пример во всех трех ответах. Программисты думают одинаково, я думаю .. – WeaselFox

+1

Я также собирался опубликовать пример, используя 'a', тоже. :) –

0

Это то, что overriding называется. Когда вы объявили вторую функцию, первая функция переопределяется второй.

так же, как вы определяете, как, например

a=1 
a=2 

тогда a будет иметь 2 в качестве конечного значения.

Смежные вопросы