函数 - 关于python闭包的一些疑问
PHPz
PHPz 2017-04-17 17:29:24
0
4
227
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)    #fs作为列表,为什么可以append(r)?(而r是f所返回的函数)
    return fs           #个人的想法应该是fs.append(r())

f1, f2, f3 = count()
print f1(), f2(), f3()

想弄明白的是:这里传入append的r是以什么形式传入的呢
谢谢各位指教:D

PHPz
PHPz

学习是最好的投资!

모든 응답(4)
迷茫

은 지연된 호출과 유사한 함수 정의 형식으로 전달됩니다.

의 예에서는 명확하지 않습니다. 으아아아

함수에서 반환되는 r에 있는 r을 변수라고 생각하면 되는데, 이 변수에 함수의 정의가 저장됩니다.
실제 함수 호출은 나중에 x()를 통해 이루어집니다

左手右手慢动作

r은 객체이고, 이 객체의 유형은 함수입니다.

즉, r은

과 같은 유형 함수의 객체입니다.
  • 1은 정수 유형의 객체

  • 입니다.
  • 'hi'는 과 마찬가지로

    String
  • 유형의 객체입니다.
大家讲道理

fs.append(r())로 변경하는 것도 가능하지만, 함수의 의미가 다릅니다. count() 함수를 실행하면 [1, 4, 9] 결과가 반환되므로 더 이상 print f1(), f2(), f3()을 사용할 수 없습니다. 그 이유는 다음과 같습니다.

으아아아

이것은 g이 아니라 g()이므로 count()을 실행하여 반환되는 것은 실제로 [g1, g2, g3] 세 개의 클로저 함수를 포함하는 목록입니다. 각 클로저 함수는 서로 다른 자유 변수(각각 1, 2, 3)를 바인딩합니다. ), 따라서 이 목록을 f1, f2, f3에 압축을 푼 후 print f1(), f2(), f3()을 실행하는 것은 세 가지 기능을 실행하고 결과를 인쇄하는 것과 동일하므로 최종 출력은 1, 4, 9

입니다.
大家讲道理

f1 = fs[0] = r = g

그래서

f1()

최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿