dict.copy () - функция мелкой копии для словаря id - встроенная функция, которая дает вам адрес переменной
. Сначала вам нужно понять: «Почему эта конкретная проблема происходит?»
In [1]: my_dict = {'a': [1, 2, 3], 'b': [4, 5, 6]}
In [2]: my_copy = my_dict.copy()
In [3]: id(my_dict)
Out[3]: 140190444167808
In [4]: id(my_copy)
Out[4]: 140190444170328
In [5]: id(my_copy['a'])
Out[5]: 140190444024104
In [6]: id(my_dict['a'])
Out[6]: 140190444024104
Адрес списка, присутствующего в dicts для ключа 'a', указывает на то же местоположение. Поэтому, когда вы изменяете значение списка в my_dict, также изменяется список в my_copy.
Решение:
In [7]: my_copy = {key: value[:] for key, value in my_dict.items()}
In [8]: id(my_copy['a'])
Out[8]: 140190444024176
Или вы можете использовать глубокую копию, как указано выше.
Прочтите Расширенное руководство по сценариям на Bash , глава 19. Здесь документы .
Вот пример, который запишет содержимое в файл по адресу / tmp / yourfilehere
cat << EOF > /tmp/yourfilehere
These contents will be written to the file.
This line is indented.
EOF
Обратите внимание, что последний 'EOF' ( LimitString
) не должен иметь пробелов перед слово, потому что это означает, что LimitString
не будет распознан.
В сценарии оболочки вы можете захотеть использовать отступ, чтобы сделать код читаемым, однако это может иметь нежелательный эффект в виде отступа текста в вашем документе здесь. В этом случае используйте << -
(за которым следует тире), чтобы отключить ведущие табуляции ( Обратите внимание , что для проверки вам потребуется заменить начальный пробел табуляцией , так как я не могу напечатать здесь настоящие символы табуляции.)
#!/usr/bin/env bash
if true ; then
cat <<- EOF > /tmp/yourfilehere
The leading tab is ignored.
EOF
fi
Если вы не хотите интерпретировать переменные в тексте, используйте одинарные кавычки:
cat << 'EOF' > /tmp/yourfilehere
The variable $FOO will not be interpreted.
EOF
Чтобы передать heredoc через конвейер команд:
cat <<'EOF' | sed 's/a/b/'
foo
bar
baz
EOF
] Вывод:
foo
bbr
bbz
... или записать heredoc в файл с помощью sudo
:
cat <<'EOF' | sed 's/a/b/' | sudo tee /etc/config_file.conf
foo
bar
baz
EOF
Для будущих людей, которые могут столкнуться с этой проблемой, работает следующий формат:
(cat <<- _EOF_
LogFile /var/log/clamd.log
LogTime yes
DatabaseDirectory /var/lib/clamav
LocalSocket /tmp/clamd.socket
TCPAddr 127.0.0.1
SelfCheck 1020
ScanPDF yes
_EOF_
) > /etc/clamd.conf