2017-02-23 30 views
2

Я родом из C/C++ фона и я продолжаю набрав вещи, какпрединкремент операторы в питоне

ix = -1 
fred = objlist[++ix].value 

Это не работает, потому что нет никакого оператора прединкремента в питоне. Он просто дает мне элемент с индексом -1. Это нормально - я знаю, как это исправить.

На самом деле, я только недавно узнал, когда я заснул на клавиатуре, что позволяет

------------------ix 

Это также позволяет

++++++++++++++++++ix 

То, что я не могу понять, почему питон синтаксис позволяет ++ ix и --ix. Синтаксис не позволяет ix ++ или ix--.

+5

'++ ix' в Python эквивалентен' + (+ ix) '(т. Е.' Ix'). Аналогично для '- (- ix)'. http://stackoverflow.com/questions/774784/is-it-possible-to-overload-operators-in-python/774791#774791/http://stackoverflow.com/questions/470139/why-does-12- 3 – kennytm

+0

Попробуйте найти унарный оператор + в python –

+1

В Python целые числа не изменяются, оператор будет неэффективен. Чтобы увеличить один, используйте 'ix + = 1', что эквивалентно' ix = ix + 1'. –

ответ

5

целые числа в python являются неизменяемыми, и поэтому пост-приращение не допускается, а предварительный прирост не работает.

И так как целые числа являются неизменными, единственным способом для изменения, является переназначение их следующим образом:

x += 1 

++ не является оператором. Это два оператора +. Оператор + является тождественным оператором, который ничего не делает, поэтому ++x не влияет на переменную.

Для уточнения:

++x 

разбирает к +(+x) который переводит к x

На практике оператор identiy + не используется часто. Ниже приведено определение в документации Python:

Оператор унарного + (плюс) дает свой числовой аргумент без изменений.

Вот пример, который я нашел в StackOverflow, где она используется с десятичным округлением:

>>> from decimal import Decimal 
>>> obj = Decimal('3.1415926535897932384626433832795028841971') 
>>> +obj != obj # The __pos__ function rounds back to normal precision 
True 
>>> obj 
Decimal('3.1415926535897932384626433832795028841971') 
>>> +obj 
Decimal('3.141592653589793238462643383') 

Что касается поста приращения: Так как этот оператор не определен в Python, x++ дает синтаксическую ошибку, как синтаксический анализатор не может понять смысл этого выражения.

IMHO Pyton должен ПРЕДОСТЕРЕЖЕНИЕ, когда программист делает ++, потому что это может привести к многочисленным ошибкам со стороны разработчиков C/C++/C#, целью которых является выполнение предварительного приращения переменной.

+1

Возможно, нам просто нужно что-то в режиме ожидания - это то, где большинство людей проводят свои эксперименты. Возможно, что-то вроде ** программиста на C++?Вы не можете это сделать в Python ** – cup

+0

Неизменяемость целых чисел не связана с тем, разрешает ли он синтаксический сахар до и после инкремента. Это зависит от дизайнерских решений Guido, см. Также: http://stackoverflow.com/questions/3654830/why-are-there-no-and-operators-in-python –