Доступ к элементам со смещениями в Python для.. в циклах

Принятие Вас хотело перезаписать предыдущее значение объекта, упомянутого 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== и работают над значениями - копирование значений и сравнение значений соответственно.

9
задан int3 15 August 2009 в 15:20
поделиться

2 ответа

В Python это можно сделать следующим образом:

for i, x in enumerate(SomeArray):
    print i, x

Генератор enumerate создает последовательность из двух кортежей, каждый из которых содержит индекс массива и элемент.

15
ответ дан 4 December 2019 в 10:05
поделиться

Индексирование списка и 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 (исключая два последних элемента) индексируются как [:

6
ответ дан 4 December 2019 в 10:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: