python-閉パッケージの概念とappend()とextend()の違い

3590 ワード

まずコードを見てみましょう.
def count():
    fs = []
    for i in range(1, 4):
        def f(j):
            def g():
                return j*j
            return g
        r = f(i)
        fs.append(r)
    return fs
f1, f2, f3 = count()
print f1(), f2(), f3()

このコードの出力結果は1,4,9です.
次のコード
def count():
    fs = []
    for i in range(1, 4):
        def f():
             return i*i
        fs.append(f)
    return fs

f1, f2, f3 = count()

このコードの出力結果は9,9,9である.f 1()、f 2()、f 3()を呼び出すと結果は1,4,9になると思いますが、実際の結果はすべて9になります(自分で検証してください).
なぜならcount()関数が3つの関数を返すと,この3つの関数が参照する変数iの値が3になるからである.f 1,f 2,f 3は呼び出されていないため、このときi*iは計算されず、f 1が呼び出された場合:
f 1()9#は、f 1がi*iを計算したばかりなので、iの値が3になったので、戻り関数はループ変数やその後に変化する変数を参照しないでください.
ここでappend()とextend():extend()は、既存のリストの末尾に要素を追加することができ、1つのパラメータしか入力できません.このパラメータはlistのみです.eg:
myList = [1,2.0,'a']
myList.extend([123,'abc'])
 >>> myList
[1, 2.0, 'a', 'APP', 123, 'abc']

appendは任意で、tupleの下に文字列を加えた例もあります.
myList = [1,2.0,'a']
myList.append('APP')
>>> myList
[1, 2.0, 'a', 'APP']

上の両端のコードがなぜ結果が違うのかを話します.閉包:内層関数は外層関数変数(パラメータも変数)を参照し、内層関数を返す場合を閉包(Closure)と呼びます.閉パケットの特徴は、返される関数が外層関数のローカル変数も参照することです.したがって、閉パケットを正しく使用するには、参照されるローカル変数が関数が返された後に変化しないことを確認する必要があります.
一つの大神の解釈、複製して見て、私が詳しくあなたにあげた解釈を見てくれてありがとう.あなたは知っているかもしれません.このセクションを見てください.printを追加したいくつかのコードにコメントしてください.f 1,f 2,f 3=count()にはなぜ3つの要素f 1,f 2,f 3があるのか.count()はfsを返すので、fsは何ですか?リストです.何のリストですか.3つの要素のリストがあります.なぜ3つの要素があるのですか?for文のrang(1,4)のためです.したがって、f 1,f 2,f 3=[値,値,値]に相当する.したがって、f 1,f 2,f 3には、[値、値、値]3つにそれぞれ一致するため、f 4またはf 2,f 3のいずれかを多く書くことはできません.はい、リストの値を聞いてみます.[1,4,9]?ははは、間違っています.いいえ、r出力が見えます.