Принятие Вас хотело перезаписать предыдущее значение объекта, упомянутого a
, затем функция членства должна будет быть вызвана.
Complex a, b, c;
// ...
a = b.add(c);
В C++, это выражение говорит компилятору создавать три (3) объекта на стеке, выполнять дополнение, и копия результирующее значение от временного объекта в существующий объект a
.
Однако в Java, operator=
не выполняет копию значения для ссылочных типов, и пользователи могут только создать новые ссылочные типы, не оценить типы. Таким образом для пользовательского типа, названного Complex
, присвоение означает копировать ссылку на существующее значение.
Рассматривают вместо этого:
b.set(1, 0); // initialize to real number '1'
a = b;
b.set(2, 0);
assert( !a.equals(b) ); // this assertion will fail
В C++, это копирует значение, таким образом, сравнение закончится не - равный. В Java, operator=
выполняет ссылочную копию, таким образом a
и b
теперь относятся к тому же значению. В результате сравнение произведет 'равный', так как объект выдержит сравнение равный себе.
различие между копиями и ссылками только добавляет к беспорядку перегрузки оператора. Поскольку упомянутые @Sebastian, Java и C# и должны иметь дело со значением и ссылочным равенством отдельно - operator+
, вероятно, имел бы дело со значениями и объектами, но operator=
уже реализован для контакта со ссылками.
В C++, необходимо только иметь дело с одним видом сравнения за один раз, таким образом, это может менее сбивать с толку. Например, на [1 111], operator=
и operator==
и работают над значениями - копирование значений и сравнение значений соответственно.
В Python это можно сделать следующим образом:
for i, x in enumerate(SomeArray):
print i, x
Генератор enumerate
создает последовательность из двух кортежей, каждый из которых содержит индекс массива и элемент.
Индексирование списка и zip () - ваши друзья.
Вот мой ответ на ваш более конкретный вопрос:
Я могу добавить текущий элемент к элементу на два шага позади него. . Есть ли способ сделать это, не прибегая к явным индексам?
arr = range(10)
[i+j for i,j in zip(arr[:-2], arr[2:])]
Вы также можете использовать модуль numpy , если собираетесь работать с числовыми массивами. Например, приведенный выше код можно более элегантно записать как:
import numpy
narr = numpy.arange(10)
narr[:-2] + narr[2:]
Добавление n-го элемента к (n-2) -ому элементу эквивалентно добавлению m-го элемента к (m + 2) элементу (для математически склонных, мы выполнили замену n-> m + 2). Диапазон n составляет [2, len (arr)), а диапазон m - [0, len (arr) -2). Обратите внимание на скобки и скобки. Элементы от 0 до len (arr) -3 (исключая два последних элемента) индексируются как [: