2017-04-05 1 views
4

파이썬에서 선형 합동 생성기를 작성하려고하고 있는데 code on Wikipedia이라는 작은 조각을 발견했지만 그것을 이해하는 데 약간의 어려움이 있습니다. 코드는 다음과 같습니다 :파이썬에서의 기능

def lcg(modulus, a, c, seed=None): 
    if seed != None: 
     lcg.previous = seed 
    random_number = (lcg.previous * a + c) % modulus 
    lcg.previous = random_number 
    return random_number/modulus 
lcg.previous = 2222 

내 문제는 "lcg.previous"입니다. 함수가 완료되었다는 것을 알아 채면 lcg.previous의 값이 업데이트되고 저장됩니다. 함수 lcg()의 멤버 변수로 선언 되었습니까? 아니면 실제로 파이썬의 모든 함수에 대해 설정된 일종의 기본값입니까?

고맙습니다.

+0

코드 스 니펫을 발견 한 곳의 참조를 제공 할 수 있습니다. – Alex

+0

모든 관련 코드를 복사하지 않았으며 lcg.previous는 함수 정의 바로 다음에 시작 값으로 설정되어 있습니다. –

+0

죄송합니다. 편집 된 버전을 업로드하는 일이 있습니다. 편집 해 주셔서 감사합니다. – Xuan

답변

5

이것은 함수의 "멤버 변수"이므로, 호출 할 때마다 (seed에 대해 호출 할 때를 제외하고) 시퀀스는 중단 된 부분을 선택합니다.

+0

+1입니다. 참고로, 이것으로'static' 함수 변수의 동작을 에뮬레이션 할 수 있습니다. 예를 들어 C. –

+0

과 같은 다른 언어에서 공통적 인 부분을 설명해 주셔서 감사합니다. – Xuan

0

파이썬은 lcg.previous를 새로운 변수 선언으로 인식하고이를 lcg의 멤버로 추가합니다.

+0

파이썬에는 변수 선언이 없습니다. –

+0

그것은 단지 암시 된 것입니다. 라인 lcg(modulus, a, c, seed=None):은 모듈러스, a, c 및 시드의 로컬 변수 선언을 암시합니다. lcg.previous 줄은 멤버 변수의 암묵적인 선언입니다. 파이썬은 후드 아래에서 변수 선언의 껄끄 러운 부분을 추상화합니다. – Stephan

+1

Python, 언어에는 변수 선언이 없습니다. 변수가 할당되면 변수가 존재하게됩니다 (https://docs.python.org/3/tutorial/classes.html#instance-objects). 변수 선언의 언어 구조는 C, C++, Java 등에서와 마찬가지로 Python에는 존재하지 않습니다. Python에서는 할당 만 있습니다. 당신은 용어로 느슨한 게임을하고 있습니다. –

0

previous 변수는 lcg 함수의 속성입니다. 이 예제에서는 lcg 함수의 정적 변수로 사용됩니다. 파이썬은 변수 (또는 객체 멤버)를 사용하기 전에 선언 할 필요가 없으므로 필요할 때 생성 할 수 있습니다. 이 경우 lcg 함수 객체의 previous 멤버를 만듭니다.