python 변수와 변수 부여의 몇 가지 형식
동적 유형의 언어
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'
*
접두사 변수를 사용할 때, 서열에 대응하는 요소를 모두 목록에 수집하는 것을 표시합니다. (항상 하나의 목록입니다.) 이 목록의 이름은 *
로 시작하는 변수 이름입니다.*
호는 임의의 위치에 나타날 수 있고 값을 부여할 때 앞뒤로 대응하는 위치 관계만 있으면 된다.그중의 몇 가지 키워드를 주의하십시오: 시퀀스, 대응하는 요소, 목록
어쨌든 수집된 결과는 항상 목록이다. 단지 빈 목록일 수도 있고, 단지 하나의 요소만 있는 목록일 수도 있다.
예를 들면 다음과 같습니다.
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의 일부 상황에서, 이러한 이원 할당 표현식은 일반적인 할당 방식보다 효율이 더 높을 수 있다.두 가지 이유가 있습니다.
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)도 등가이다. 모두 메모리의 원시 목록에서 직접 수정하고 복사 작업이 없고 새로 만든 데이터 대상은 단지 하나의 요소일 뿐이다.
이론적으로 말하자면 확실히 이원 할당 방식이 효율적이어야 하지만 주의해야 할 것은 목록에 저장된 것은 각 요소의 인용일 뿐이기 때문에 복사 목록도 약간의 인용만 복사하는 것이 매우 적은 비용이다.그래서 일원부치와 이원부치의 차이는 이 점의 성능에 있어 기본적으로 차이가 없다. 주요한 차이는 일원, 이원부치 방식에 존재할 수 있는 표현식의 서로 다른 평가 횟수에 있다.
전반적으로 말하면 이원부치 표현식을 사용하면 일반적으로 가변 대상부치의 최적화 수단으로 쓸 수 있다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.