Умножьте оператор, примененный к списку (структура данных)

Вы можете использовать расширение параметра замены 111 Bash для заполнения переменной цикла. Например:

MANPATH=/usr/lib:/usr/sfw/lib:/usr/info

# Replace colons with spaces to create list.
for path in ${MANPATH//:/ }; do
    echo "$path"
done

Примечание. Не заключайте подстановочное расширение в кавычки. Вы хотите, чтобы расширенные значения из MANPATH интерпретировались циклом for как отдельные слова, а не как одна строка.

11
задан Aman Aggarwal 20 August 2009 в 08:15
поделиться

2 ответа

ВСЕ в python являются объектами, и python никогда не делает копии, если об этом явно не просят.

Когда вы делаете

innerList = [0] * 10

, вы создаете список из 10 элементов, все из они относятся к одному и тому же объекту int 0 .

Поскольку целочисленные объекты неизменяемы , когда вы делаете

innerList[1] = 15

, вы меняете второй элемент list так, чтобы он ссылался на другое целое число 15 . Это всегда работает из-за неизменности объектов int .

Вот почему

outerList = innerList * 5

создаст объект list с 5 элементами, каждый из которых является ссылкой на тот же innerList , как указано выше. Но поскольку объекты list являются изменяемыми :

outerList[2].append('something')

То же, что:

innerList.append('something')

Потому что это две ссылки на тот же объект списка . Таким образом, элемент попадает в единственный список . Кажется, что он дублируется, но факт в том, что существует только один объект list и много ссылок на него.

Напротив, если вы делаете

outerList[1] = outerList[1] + ['something']

Здесь вы создаете ] другой список объект (использование + со списками является явной копией) и присвоение ссылки на него во второй позиции externalList . Если вы «добавите» элемент таким образом (не добавляя, а создавая другой список), innerList не будет затронут.

но факт в том, что существует только один объект list и много ссылок на него.

Напротив, если вы делаете

outerList[1] = outerList[1] + ['something']

Здесь вы создаете еще один список объект (использование + со списками является явной копией) и назначение ссылки на него во второй позиции externalList . Если вы «добавите» элемент таким образом (не добавляя, а создавая другой список), innerList не будет затронут.

но факт в том, что существует только один объект list и много ссылок на него.

Напротив, если вы делаете

outerList[1] = outerList[1] + ['something']

Здесь вы создаете еще один список объект (использование + со списками является явной копией) и назначение ссылки на него во второй позиции externalList . Если вы «добавите» элемент таким образом (не добавляя, а создавая другой список), innerList не будет затронут.

18
ответ дан 3 December 2019 в 08:05
поделиться

списки не являются примитивами, они передаются по ссылке. Копия списка - это указатель на список (на жаргоне C). Все, что вы делаете со списком, происходит со всеми копиями списка и копиями его содержимого, если вы не делаете неглубокую копию.

[[0] * columns] * rows

Ой, мы только что составили большой список указателей на [0]. Измените один, и вы измените их все.

Целые числа не передаются по ссылке, они действительно копируются, поэтому [0] * contents действительно создает множество НОВЫХ 0 и добавляет их в список.

-3
ответ дан 3 December 2019 в 08:05
поделиться
Другие вопросы по тегам:

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