왜이없는 ++
및 --
파이썬에서 연산자는?
답변
이해가되지 않기 때문이 아닙니다. “x ++”를 “x + = 1로 정의하여 x의 이전 바인딩으로 평가”하는 것이 좋습니다.
원래의 이유를 알고 싶다면 오래된 파이썬 메일 링리스트를 살펴 보거나 거기에 있던 누군가에게 물어봐야합니다 (예 : 귀도). 그러나 사실 이후 정당화하기는 쉽습니다.
다른 언어만큼 간단한 증감이 필요하지 않습니다. for(int i = 0; i < 10; ++i)
파이썬 과 같은 것을 자주 쓰지 않습니다 . 대신 당신은 같은 일을 for i in range(0, 10)
합니다.
거의 자주 필요하지 않기 때문에 고유 한 구문을 제공 할 이유가 훨씬 적습니다. 증분해야 할 때 +=
일반적으로 괜찮습니다.
그것이 의미가 있는지, 할 수 있는지, 할 수 있는지, 할 수 있는지에 대한 결정은 아닙니다. 이점이 언어의 핵심 구문에 추가 할 가치가 있는지에 대한 질문입니다. 이것은 postinc, postdec, preinc, predec의 네 가지 연산자이며 각각의 클래스 오버로드가 필요합니다. 그것들은 모두 명시되고 테스트되어야한다. 언어에 opcode를 추가합니다 (더 큰 VM 엔진을 의미 함). 논리적 증가를 지원하는 모든 클래스는 (위에이를 구현해야 +=
하고 -=
).
이 모두와 +=
와 중복 -=
되므로 순손실이됩니다.
답변
내가 쓴이 원래의 대답은 컴퓨팅 민속학의 신화입니다. Dennis Ritchie 가 ACM 커뮤니케이션 편집자에게 보낸 편지에서 2012 년 7 월 doi : 10.1145 / 2209249.2209251에 언급 된 것처럼 “역사적으로 불가능하다”고 주장했습니다.
C 증분 / 감소 연산자는 C 컴파일러가 똑똑하지 않은 시점에 발명되었으며 저자는 기계 언어 연산자를 사용해야하는 직접적인 의도를 지정할 수 있기를 원했습니다. 할 수 있습니다
load memory
load 1
add
store memory
대신에
inc memory
PDP-11 은 각각 *++p
및에 해당하는 “자동 증가”및 “자동 증가 지연”명령도 지원 *p++
했습니다. 몹시 호기심이 많으면 설명서 의 섹션 5.3을 참조하십시오 .
컴파일러는 C 구문에 내장 된 고급 최적화 트릭을 처리 할 수있을만큼 똑똑하기 때문에 지금은 구문상의 편의에 불과합니다.
파이썬에는 의도를 사용하지 않기 때문에 의도를 어셈블러에 전달하는 트릭이 없습니다.
답변
나는 항상 파이썬의이 선과 관련이 있다고 가정했습니다.
이를 수행 할 수있는 분명한 방법은 하나만 있어야합니다.
x ++와 x + = 1은 똑같은 작업을 수행하므로 둘 다 가질 이유가 없습니다.
답변
물론 우리는 “Guido가 그렇게 결정했다”고 말할 수는 있지만, 그 결정에 대한 이유는 문제라고 생각합니다. 몇 가지 이유가 있다고 생각합니다.
- 문장과 표현을 혼합하여 사용하는 것은 좋지 않습니다. http://norvig.com/python-iaq.html 참조
- 일반적으로 사람들이 읽기 어려운 코드를 작성하도록 권장합니다.
- 이미 언급했듯이 파이썬에서는 필요하지 않은 언어 구현의 추가 복잡성
답변
파이썬에서 정수는 불변이기 때문에 (int의 + =는 실제로 다른 객체를 반환합니다).
또한 ++ /-를 사용하면 사전 및 사후 증분 / 감소에 대해 걱정할 필요가 있으며 키를 한 번 더 입력하면 x+=1
됩니다. 다시 말해, 이득이 거의 없어도 혼동을 피할 수 있습니다.
답변
명쾌함!
파이썬은 명확성 에 대해 많은 것이 있으며, --a
그 구조를 가진 언어를 배우지 않으면 프로그래머가 그 의미를 정확하게 추측하지 못할 것 입니다.
파이썬은 또한에 대해 많은입니다 실수를 초대 구조 피 와 ++
운영자가 결함의 풍부한 소스 것으로 알려져됩니다. 이 두 가지 이유는 파이썬에서 그 연산자를 갖기에 충분하지 않습니다.
파이썬이 들여 쓰기를 사용하여 시작 / 종료 브라케팅 또는 필수 끝 표시와 같은 구문 적 수단보다는 블록을 표시한다는 결정은 대체로 동일한 고려 사항을 기반으로합니다.
예를 들어, 2005 년 에 조건부 연산자 (C cond ? resultif : resultelse
:)를 파이썬에 도입하는 것에 관한 토론을 살펴 보십시오. 적어도 첫 번째 메시지를 읽으십시오. 그 토론 와 결정 메시지 (이전에 동일한 주제에 대해 여러 개의 선구자가 있음 .
퀴즈 :
자주 언급되는 PEP는 “Python Extension Proposal” PEP 308 입니다. LC는 list comprehension을 의미 하고 GE는 generator expression을 의미 합니다 (그리고 혼동하더라도 걱정할 필요가 없습니다. 파이썬의 복잡한 부분은 아닙니다).
답변
파이썬에 ++
연산자가 없는 이유에 대한 나의 이해 는 다음과 같습니다. 파이썬으로 이것을 작성할 때 a=b=c=1
동일한 객체 (값 1)를 가리키는 세 개의 변수 (라벨)가 나타납니다. 객체 메모리 주소를 반환하는 id 함수를 사용하여이를 확인할 수 있습니다.
In [19]: id(a)
Out[19]: 34019256
In [20]: id(b)
Out[20]: 34019256
In [21]: id(c)
Out[21]: 34019256
세 가지 변수 (라벨)는 모두 같은 객체를 가리 킵니다. 이제 변수 중 하나를 증가시키고 그것이 메모리 주소에 어떻게 영향을 미치는지보십시오 :
In [22] a = a + 1
In [23]: id(a)
Out[23]: 34019232
In [24]: id(b)
Out[24]: 34019256
In [25]: id(c)
Out[25]: 34019256
a
변수가 변수 b
및 로 다른 객체를 가리키는 것을 볼 수 있습니다 c
. 당신이 a = a + 1
그것을 사용했기 때문에 분명합니다. 다시 말해 label에 완전히 다른 객체를 할당합니다 a
. a++
변수에 할당하지 않았다고 제안 할 수 있다고 상상해보십시오.a
새 객체에 오래된 객체를 래터 증가 시킨다는 . 이 모든 것은 혼란을 최소화하기위한 IMHO입니다. 더 잘 이해하려면 파이썬 변수의 작동 방식을 참조하십시오.
파이썬에서 함수가 호출자가 인식 한 일부 인수를 수정할 수 있지만 다른 인수는 수정할 수없는 이유는 무엇입니까?
파이썬은 값에 의한 호출입니까, 아니면 참조에 의한 호출입니까? 둘 다.