簡體   English   中英

python中的函數名稱相同,沒有錯誤?

[英]Same function names in python , No error?

老實說,我期待發生某種錯誤,例如“ 您不能在同一個主體中重命名具有相同名稱的兩個嵌套函數” ,我們可以在python中定義任意數量的具有相同名稱的函數嗎?

In [40]: def add(i,j):
   ....:     def add(i,j):
   ....:         print i+j
   ....:     def add(i,j):    
   ....:         print i-j
   ....:     return add(i,j)
   ....: 

In [41]: add(5,4)
1

這是功能的重載,還是功能的重載?

定義一個函數就像給一個變量賦值。 您可以在Python中執行此操作:

a = 1
a = 2

同樣,您可以執行以下操作:

def f():
    return 1
def f():
    return 2

在這兩種情況下,指定的最后一個值都會覆蓋以前的所有值。 因此,最后一個獲勝。

它是嵌套函數這一事實與問題無關。 在任何情況下都一樣。

當然。 def語句在功能上是(函數到名稱的)賦值,並且您可以具有任意多個相同名稱的賦值。 (認識到函數定義是在Python中執行的,在編譯時不會對其進行靜態評估是很重要的。)

有很多方法可以在類定義中捕獲此問題,例如我五月份發布的方法 如果您使用的是Python 3,那么還有更好的方法

對於函數來說,這是行不通的,因此我相信您會被這種行為所困擾。

最后一個函數會覆蓋其他函數...因此,沒有錯誤! :)

函數定義在當前符號表中引入函數名稱。 函數名稱的值具有一種類型,該類型可以被解釋器識別為用戶定義的函數。 然后可以將此值分配給另一個名稱,甚至可以通過重新定義功能來重新分配。

在重新定義函數的情況下,將使用最新定義,因為它是解釋器可以識別的函數。

只需清楚一點,第二個嵌套的add()覆蓋第一個,但外部的則保持不變。

這是一個最小的示例:

def do_sth(s):
    def do_sth(s):
        print('Hello, %s!' % s)
    print('Ola')
    do_sth(s)

>>> do_sth('chuinul')
Ola
Hello, chuinul!
>>> do_sth('chuinul')
Ola
Hello, chuinul!

當您第二次調用do_sth()時,這仍然是您定義的正在調用的外部函數。 否則,您將只有:

>>> do_sth('chuinul')
Hello, chuinul!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM