Вместо добавления используйте равный "="
from iptcinfo3 import IPTCInfo
info = IPTCInfo('Gus.jpg')
print(info['keywords'])
# add keyword
info['keywords'] = ['new keyword']
info.save()
info.save_as('Gus_2.jpg')
Хм. Необходимо различать массивы и ассоциативные массивы.
массивы:
A=[0,1,4,9,16];
ассоциативные массивы:
B={a:'ha',b:27,c:30};
У первого есть длина, последний не делает. Когда я выполняю это в оболочке JavaScript, я добираюсь:
js>A=[0,1,4,9,16];
0,1,4,9,16
js>A instanceof Array
true
js>A.length
5
js>B={a:'ha',b:27,c:30};
[object Object]
js>B instanceof Array
false
js>B.length
js>
Как массивы "работа" в JavaScript являются зависящими от реализации. (Firefox и Microsoft и Opera и Google Chrome все использовали бы различные методы), Мое предположение, они (массивы, не ассоциативные массивы) используют что-то как станд. STL:: вектор. Ваш вопрос:
как память выделяется, чтобы массив все еще обеспечил O (1) время доступа, так как 'сумма' ячеек памяти не указана заранее?
больше вроде как станд.:: вектор (или подобные массивы изменяемого размера) работы. Это перераспределяет к большему массиву по мере необходимости. Вставки в конце берут амортизируемый O (1) время, а именно, при вставке элементов N, где N является большим, общее время берет N*O (1). Те, которых вводит человек, где это действительно должно изменить размер массива, могут занять больше времени, но в среднем это берет O (1).
Массивы в JavaScript являются "фальшивкой". Они реализованы, поскольку хеш отображается. Таким образом в худшем случае их время доступа не является O (1). Им также нужно больше памяти, и можно использовать любую строку в качестве индекса массива. Вы думаете, что это странно? Это.
JavaScript не имеет никаких действительных массивов. Элементы выделяются, поскольку Вы определяете их.
Это - гибкий инструмент. Можно использовать во многих целях, но поскольку инструмент общего назначения не так эффективен как массивы особого назначения.
Как я понимаю, это похоже на это:
В JavaScript существует две разных вещи: Массивы и Объекты. Они оба действуют как хеш-таблицы, хотя конкретная реализация характерна для каждого времени выполнения. Различие между этими двумя - то, что Массив имеет неявное length
свойство, в то время как объект не делает. Иначе можно использовать []
или .
синтаксисы для них обоих. Да, это означает, что объекты могут иметь числовые свойства, и массивы имеют индексы строк.Нет проблем. Хотя length
свойство не могло бы быть тем, что Вы ожидаете при использовании таких приемов или разреженных массивов. Необходимо полагаться на него, только если массив не является разреженным, и индексы запускаются от 0.
Что касается производительности - извините, это не O (1), Вы ожидали бы. Как указано прежде - это - на самом деле конкретная реализация. Но в общем случае не возможно гарантировать, что будет O (1) производительность для всех операций в хеш-таблице. Тем не менее я ожидал бы, что достойные реализации должны иметь в распоряжении довольно много оптимизации для стандартных случаев, которые сделали бы производительность вполне близко к O (1) согласно большинству сценариев. Но во всяком случае - хранение огромных объемов данных в JavaScript не является мудрой идеей.
Это - то же в PHP. Я произошел из среды PHP/Javascript, и определяющие размерность массивы действительно получили меня, когда я перешел на другие языки.
Как Jason сказал, если это явно не указано стандартом ECMAScript (вряд ли), это является зависящим от реализации. Статья, показанная Ногами, показывает, что реализация IE была плоха (пока IE8?), который подтвержден производительностью цикла JavaScript.
Другие механизмы JS, вероятно, проявляют более прагматический подход. Например, они могут сделать как в Lua, имея истинную часть массива и часть ассоциативного массива: если массив является плотным, он живет в истинном массиве (который может все еще быть расширен за счет перераспределения), и у Вас могут все еще быть редкие высокие индексы, живущие в ассоциативной части.
Таким образом у Вас есть лучший из двух миров, скорость доступа к плотным частям и низкому использованию памяти для редких частей.