首頁 >後端開發 >Python教學 >為什麼巢狀 Python 函數在執行時而不是定義時存取變數?

為什麼巢狀 Python 函數在執行時而不是定義時存取變數?

Patricia Arquette
Patricia Arquette原創
2024-12-24 13:27:30884瀏覽

Why Do Nested Python Functions Access Variables at Execution Time, Not Definition Time?

巢狀函數和局部變數存取

在Python中,巢狀函數可以從其封閉範圍存取局部變數。但是,此訪問的時間可能違反直覺。

考慮以下程式碼片段:

class Cage(object):
    def __init__(self, animal):
        self.animal = animal

def gotimes(do_the_petting):
    do_the_petting()

def get_petters():
    for animal in ['cow', 'dog', 'cat']:
        cage = Cage(animal)

        def pet_function():
            print "Mary pets the " + cage.animal + "."

        yield (animal, partial(gotimes, pet_function))

funs = list(get_petters())

for name, f in funs:
    print name + ":",
    f()

輸出顯示“Mary pets”,而不是獲得Mary 撫摸每隻動物的預期輸出貓”代表所有三種動物。出現這種現象是因為巢狀函數pet_function 在執行時尋找局部變數cage,而不是在定義時尋找。會依序指派給每個動物循環內。

要解決這個問題,可以使用不同的技術,例如:

    使用帶有綁定籠的部分函數變數:
  • from functools import partial
    
    def pet_function(cage):
      print "Mary pets the " + cage.animal + "."
    
    yield (animal, partial(gotimes, partial(pet_function, cage=cage)))
  • 為巢狀函數建立新作用域:
  • def scoped_cage(cage):
      def pet_function():
          print "Mary pets the " + cage.animal + "."
      return pet_function
    
    yield (animal, partial(gotimes, scoped_cage(cage)))
  • 將變數綁定為 a的預設值關鍵字參數:
  • def pet_function(cage=cage):
      print "Mary pets the " + cage.animal + "."
    
    yield (animal, partial(gotimes, pet_function))

以上是為什麼巢狀 Python 函數在執行時而不是定義時存取變數?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn