2015-01-03 72 views
0

有人可以解釋python如何賦值給y。我理解這個函數是如何工作的,但我不明白函數調用a(10)如何賦值ypython如何賦值給內部函數

def outside(x): 
    def inside(y): 
     return x ** y 
    return inside 

a = outside(2) 

a(10) 
+2

來吧,你甚至讀過你標記過的這個重複的問題嗎? –

+0

閱讀裝修。 – Maroun

+0

@scopa,它是一個函數工廠,外面基本上是通過指數來提高然後使用(10)你調用內部函數,其中y被提升到x的冪。如果你打印一個.__ closure__,你會看到python創建一個閉包來引用該對象。 –

回答

3

在此代碼a()有效是inside()一個別名,與x固定在2的值。

因此a(10)本質上是inside(10),即值y10

由於x2y10a(10)返回2 ** 10(1024)。

這種類型的結構被廣泛用於Python裝飾器。我建議Understanding Python Decorators in 12 Easy Steps!作爲一個很好的介紹。除此之外它解釋了Python的功能是如何第一類對象,並可以分配給變量,其他函數的參數等通過

+0

他稱他的功能'裏面'不是'內部' – Duncan

+0

@Duncan:好的,謝謝。 – NPE

+0

謝謝我明白,y被賦值10.我不清楚python如何接受a()作爲別名。 – scopa

1

一步會發生什麼情況,步:

  1. 你調用outside功能與x = 2
  2. outside返回在x的上下文中定義的功能inside2
  3. 所以,現在,a包含功能:def inside(y): return 2 ** y
  4. 你打電話a(10),這是回顧第3步,inside(10)

此功能稱爲Functions as First-Class Objects - 這基本上意味着,功能就像類實例,可以保持狀態,並且可以在變量和參數傳遞,就像其他任何東西。注意下面的例子:

>>> def x(): 
...  pass 
... 
>>> x 
<function x at 0x02F91A30> # <-- function's address 
>>> type(x) 
<type 'function'> 
>>> 
>>> y = x 
>>> type(y) 
<type 'function'> 
>>> y 
<function x at 0x02F91A30> # <-- the same address 
>>> 
+0

非常有幫助 - 謝謝 – scopa