Переменные Python содержат указатели или ссылки на объекты. Все значения (даже целые) являются объектами, а присваивание изменяет переменную на другой объект. Он не сохраняет новое значение в переменной , он изменяет переменную для ссылки или указывает на другой объект. По этой причине многие люди говорят, что у Python нет «переменных», у него есть «имена», а операция =
не «присваивает значение переменной», а скорее «связывает имя с объектом». "
В plusOne
вы изменяете (или« мутируете ») содержимое в y
, но никогда не меняете то, что относится к самому y
. Он остается указывать на тот же список, который вы передали функции. Глобальная переменная y
и локальная переменная y
относятся к одному и тому же списку, поэтому изменения видны с использованием любой переменной. Поскольку вы изменили содержимое объекта, который был передан, на самом деле нет причин возвращать y
(фактически, возвращение None
- это то, что сам Python делает для таких операций, которые изменяют список «на месте» - значения возвращаются операциями, которые создают новые объекты, а не мутируют существующие).
В plusOne2
вы меняете локальную переменную a
, чтобы ссылаться на другой целочисленный объект, 3
. («Связывание имени a
с объектом 3
.») Глобальная переменная a
не изменяется этим и продолжает указывать на 2
.
Если вы не хотите изменить список, пройденный, сделать копию и изменить его. Затем ваша функция должна возвращать новый список, так как это одна из тех операций, которая создает новый объект, и новый объект будет потерян, если вы его не вернете. Вы можете сделать это как первую строку функции: x = x[:]
, например (как указывали другие). Или, если было бы полезно, чтобы функция называлась в любом случае, вы можете иметь вызывающего абонента в x[:]
, если он хочет сделать копию.
Вы можете создать псевдоним:
[alias]
ndiff = !git --no-pager diff --name-only
и затем запустить git ndiff
вместо git diff --name-only
. Или оставьте часть --no-pager
вне псевдонима и запустите git ndiff --name-only
, где ndiff
означает no-pager-diff.
Или вместо git diff
вы можете запустить git diff-tree
или git diff-files
или git diff-index
. Эти три команды являются бэкэндами сантехнических команд , которые git diff
использует (для большинства своих) различных режимов работы. Ни один из них не использует пейджер, и большинству из них требуются дополнительные опции (например, -r
), которые будут использоваться таким же образом, как git diff
их запускает, но они существуют и являются правильным способом написания скриптов [ 1115]. Для ваших собственных псевдонимов нет необходимости использовать сантехнические команды; Ваш собственный псевдоним может просто вызвать git --no-pager diff <options>
.