python 변수와 변수 부여의 몇 가지 형식

8049 단어

동적 유형의 언어


python은 동적 형식의 언어로 변수를 설명할 필요가 없습니다.
실제로python의 변수는 데이터 대상의 주소만 저장하는 데 사용됩니다.어떤 데이터 대상이든 메모리에 데이터 대상을 만든 후에 그 주소만 변수 이름에 저장합니다.그래서 변수명은 유형과 무관하지만 그것이 가리키는 값은 유형과 관련되어 수치, 문자열, 목록, 함수, 클래스, 대상 등이 될 수 있다.이러한 메모리 대상에는 최소한 3부분이 포함되어 있다. 대상 유형, 대상의 인용 계수 (개조 대상이 쓰레기 수거기에서 회수될 수 있는지 판단하는 데 사용), 대상의 값이다.
따라서 a = 3에서 변수명 a는 데이터 대상 3의 주소를 저장하고 그 다음에 문자열a = "hello"을 부여할 수 있다. 이때 a는'hello'문자열의 주소를 저장한다.이 유형이 바뀌는 과정에서 a는 단지 주소를 수정했을 뿐이다.

변수의 명명 스타일


python의 변수 이름은 숫자, 대소문자, 밑줄 세 가지 종류의 문자만 포함할 수 있고, 숫자는 첫 번째 문자가 될 수 없습니다.
또한 다음과 같은 특수한 의미를 가진 변수 이름 지정 방법도 있습니다.
  • 접두사와 접두사 쌍밑줄 변수, 예를 들어__name__ 이런 유형의 변수는python에서 특수한 의미를 가지고 대상의 내장 속성에 속한다. 이후에 클래스와 대상을 배우면 알 수 있다
  • 단일 밑줄 접두사 변수, 예를 들어 _x 이런 변수는 from ModuleName import *의 방식으로 가져오지 않는다
  • 쌍밑줄 접두사 변수, 예를 들어 __x 이런 변수는 클래스의 로컬 변수 또는 클래스의 사유 변수로 확장__classname_x
  • 이외에도 약정된 속명 방식도 있다.
  • 상수는 전체 대문자로 표시
  • 일반 변수, 함수명, 방법명은 모두 소문자로 시작한다
  • 모듈 이름, 패키지 이름은 전체 소문자로 명명
  • 클래스는 대문자로 시작한다
  • 속물로만 약속했기 때문에 강제 제한은 없다.

    변수 할당의 몇 가지 형식 디테일


    본고는python에서 변수 부여의 형식을 설명하고 세부 사항을 설명한다.다음에python에서 인용에 따라 값을 부여하는 글을 설명하는 글이 있습니다.
    python에서 변수에 값을 부여하는 몇 가지 형식입니다.
    x = "long"                  # (1). 
    x, y = "long", "shuai"      # (2). 
    [x, y] = ["long", "shuai"]  # (3). 
    a, b, c, d = "long"         # (4). 
    a, *b = 'long'              # (5). 
    a = b = "long"              # (6). 
    a += 3                      # (7). 
    ((a, b), c) = ('lo','ng')   # (8). 

    주의:python의 수치는 변할 수 없는 대상입니다. 원래대로 데이터를 수정할 수 없기 때문에 자증, 자감은 지원되지 않습니다.
    a++
    ++a
    a--
    --b

    그 중에서 (1)-(3) 너무 많은 설명이 필요 없고 유일하게 주의해야 할 것은 쉼표를 사용할 때python은 임시적이거나 영구적으로tuple로 만들어서 요소를 저장하기 때문에 x, y = "long", "shuai"는 내부에서 (x, y) = ("long", "shuai")와 완전히 같다는 것이다.
    실제적으로 목록 요소는 원조에 값을 부여하거나 원조는 목록에 값을 부여할 수 있다. 양쪽의 서열 요소의 개수만 대응할 수 있다면 좌우 양쪽의 서열 유형은 상관없다.
    >>> (x,y) = (1,2)
    >>> (x,y) = [1,2]
    >>> [x,y] = (1,2)
    >>> [x,y] = [1,2]
    >>> (x,y) = 'ab'
    >>> [x,y] = 'ab'

    (4) 값을 부여하는 방식은 서열에 값을 부여하는 행위로python에서 서열이라면 모두 이렇게 값을 부여할 수 있다.변수 할당 조건은 다음과 같습니다.
    a = "l"
    b = "o"
    c = "n"
    d = "g"

    다른 서열로 바뀌어도 마찬가지다.예를 들면 다음과 같습니다.
    a, b, c, d = ("shell","perl","php","python")
    a, b, c, d = ["shell","perl","php","python"]

    그러나 변수와 서열 중의 원소는 반드시 일일이 대응해야 한다.변수 이름이 원소의 개수와 다르면, 변수 이름이 하나만 없으면, 전체 서열에 값을 부여하는 것을 의미합니다.
    서열의 원소를 다른 변수에 값을 부여하려면 먼저 서열을 슬라이드하는 것을 고려할 수 있습니다.
    >>> str='long'
    >>> a, b, c = list(str[:2]) + [str[2:]]
    >>> a,b,c
    ('l', 'o', 'ng')

    (5)의 값 부여 방식은 바로 변수 이름을 원소 개수보다 적게 하는 방식이다.이런 값 부여 형식을 서열 해제라고 부른다. (다음은 이 값 부여 방식을 전문적으로 설명할 것이다.) 많이 나온 요소는 모두 목록의 방식으로 마지막 변수 이름에 값을 부여한다.다음과 같습니다.
    a="l"
    b=["o", "n", "g"]

    다음 두 가지 값 부여 방식에서 얻은 결과는 같다. a는 문자열이고 b는 목록이며 b는 모두 3개의 요소를 포함한다.
    a, *b = ("shell","perl","php","python")
    a, *b = ["shell","perl","php","python"]

    할당된 결과:
    shell
    ['perl', 'php', 'python']

    (6) 할당 방식은 다음과 같습니다.
    b = "long"
    a = b

    python에서 값을 부여할 때, 항상 "="오른쪽의 결과를 계산한 다음, 결과를 부여 방식에 따라 "="왼쪽의 변수에 부여합니다.따라서 이곳의 과정은 먼저'long'을 변수 b에 부여한 다음에 b를 변수 a에 부여하는 것이다.
    항상 오른쪽을 먼저 계산하기 때문에 변수를 교환하는 것이 매우 편리하다.
    a, b = "a", "b"
    
    #  :
    a, b = b, a
    
    #  :
    a = "b"
    b = "a"

    (7)의 부가가치 방식a += 3은 결과적으로 a = a + 3과 같다. 다른 언어에서 이 두 가지 부가가치 방식은 완전 등가이지만python에서 이런 부가가치 강화 방식은 후자보다 효율적이다. 왜 효율이 높은지 다음 글은 약간 설명할 것이다.어느 정도에 파이톤에서 간소화된 형식이라면 기본적으로 더 복잡한 등가 형식보다 효율이 높다.
    (8)의 값 부여 방식((a, b), c) = ('lo', 'ng')은 서열을 끼워 넣은 서열에 값을 부여하고'lo'는 원조(a, b),'ng'은 c에 값을 부여하고 원조는 더 많은 값a='l', b='o'을 부여한다.이런 값 부여 방식은python에서 매우 유용하다. 특히 표현식에서 값을 부여할 때, 예를 들어 for 순환과 함수 매개 변수:
    for (a, b, c) in [(1, 2, 3), (4, 5, 6)]:...
    for ((a, b), c) in [((1, 2), 3), ((4, 5), 6)]:...
    
    def f(((a, b), c)):...
    f(((1, 2), 3))

    시퀀스 패키지 해제 정보


    앞에서 간단히 설명한 시퀀스 패키지 해제:
    a, *b = 'long'
    * 접두사 변수를 사용할 때, 서열에 대응하는 요소를 모두 목록에 수집하는 것을 표시합니다. (항상 하나의 목록입니다.) 이 목록의 이름은 * 로 시작하는 변수 이름입니다.*호는 임의의 위치에 나타날 수 있고 값을 부여할 때 앞뒤로 대응하는 위치 관계만 있으면 된다.
    그중의 몇 가지 키워드를 주의하십시오: 시퀀스, 대응하는 요소, 목록
  • 서열은 목록, 모듈, 문자열 등이 될 수 있음을 의미한다
  • 목록은 수집이 잘못되지 않으면 하도급 변수에 값을 부여하는 것이 반드시 하나의 목록임을 의미한다
  • 에 대응하는 원소는 0 또는 임의의 원소를 목록에 수집할 수 있음을 의미한다.

  • 어쨌든 수집된 결과는 항상 목록이다. 단지 빈 목록일 수도 있고, 단지 하나의 요소만 있는 목록일 수도 있다.
    예를 들면 다음과 같습니다.
    L = ['aa','bb','cc','dd']
    a, *b = L           # a='aa',b=['bb','cc','dd']
    a, b, *c = L        # a='aa',b='bb',c=['cc','dd']
    a,*b,d = L          # a='aa',d='dd',b=['bb','cc']
    *a,d = L            # a=['aa','bb','cc'],d='dd'
    a,b,c,*d = L        # a='aa',b='bb',c='cc',d=['dd']
    a,b,c,d,*e = L      # a='aa',b='bb',c='cc',d='dd',e=[]

    두 가지 고려 사항:
  • 서열 해제는 원소의 위치에 따라 값을 부여하기 때문에 여러 개의 해제 변수가 나타날 수 없음
  • 단일 패키지 변수에 서열을 직접 부여할 때(즉 일반 변수가 없음) 이 패키지 변수는 목록이나 원조에 넣어야 한다
  • a,*b,c,*d = L     #  
    *a = L            #  
    [*a] = L          #  
    (*a) = L          #  

    단일 하도급 변수를 원조나 변수에 넣어야 하는 이유는 다음과 같은 두 가지 등가의 예를 보면 쉽게 이해할 수 있다.
    a, *b = L
    (a, *b) = L

    마지막으로, 서열 해제는 절단의 편리한 대체 방식이다.시퀀스로 패키지를 풀 수 있는 것은 모두 슬라이드로 실현할 수 있지만, 슬라이드는 추가 문자를 입력해야 한다.예를 들면 다음과 같습니다.
    a,b,c = L[0],L[1],L[2:]
    a,b,*c = L

    패키지 해제가 되돌아오는 것은 반드시 목록이지만, 시퀀스 슬라이스가 되돌아오는 내용은 시퀀스 유형에 달려 있음을 주의해야 한다.예를 들어 다음 원조의 슬라이스는 목록이 아닌 원조로 되돌아온다.
    >>> T=('aa','bb','cc','dd')
    >>> a,b,c = T[0],T[1],T[2:]
    >>> a,b,c
    ('aa', 'bb', ('cc', 'dd'))

    이원 할당 표현식


    python은 a += 3 과 같은 이원 표현식을 지원합니다.예를 들면 다음과 같습니다.
    a += 3   ->   a = a + 3
    a -= 3   ->   a = a - 3
    a *= 3   ->   a = a * 3
    ...

    python의 일부 상황에서, 이러한 이원 할당 표현식은 일반적인 할당 방식보다 효율이 더 높을 수 있다.두 가지 이유가 있습니다.
  • 이원부치 표현식에서 a는 하나의 표현식일 수 있다. 이것은 한 번만 계산하고 평가하면 되고 a=a+3에서 a는 두 번 계산해야 한다.
  • 가변 대상에 대해서는 원래 수정된 값을 직접 수정할 수 있으며, 일반적인 일원 할당 표현식은 메모리에 수정된 데이터 대상을 새로 만들고 변수에 할당해야 한다
  • 첫 번째는 설명할 필요가 없다.두 번째는 다음 예를 참조하십시오.
    L = [1,2,3]
    L = L + [4]     # (1): 
    L += [4]        # (2): 
    L.append(4)     # (3): , (2)
    
    L = L + [5,6]   # (4): 
    L += [5,6]      # (5): 
    L.extend([5,6]) # (6): , (5)

    위(1)와 (4)의 일원 할당 표현식에 대해 먼저 L을 얻은 다음에 새로운 목록 대상을 만들고 L을 새 목록 대상에 복사하여 4 또는 5,6를 새 목록 대상에 넣고 마지막에 L에게 값을 부여한다.이 과정에서 몇 가지 절차가 관련되었다. 즉, 메모리를 새로 분배하고, 메모리의 목록을 복사하고, 새로운 데이터를 넣는 것이다.
    (2)(3)는 등가이고 (5)(6)도 등가이다. 모두 메모리의 원시 목록에서 직접 수정하고 복사 작업이 없고 새로 만든 데이터 대상은 단지 하나의 요소일 뿐이다.
    이론적으로 말하자면 확실히 이원 할당 방식이 효율적이어야 하지만 주의해야 할 것은 목록에 저장된 것은 각 요소의 인용일 뿐이기 때문에 복사 목록도 약간의 인용만 복사하는 것이 매우 적은 비용이다.그래서 일원부치와 이원부치의 차이는 이 점의 성능에 있어 기본적으로 차이가 없다. 주요한 차이는 일원, 이원부치 방식에 존재할 수 있는 표현식의 서로 다른 평가 횟수에 있다.
    전반적으로 말하면 이원부치 표현식을 사용하면 일반적으로 가변 대상부치의 최적화 수단으로 쓸 수 있다.

    좋은 웹페이지 즐겨찾기