Я собираюсь продемонстрировать альтернативную структуру, чтобы передать значение списка по умолчанию функции (она одинаково хорошо работает со словарями).
Поскольку другие подробно комментируют, параметр списка привязан к функции, когда она определена, а не когда она выполняется. Поскольку списки и словари изменяемы, любое изменение этого параметра влияет на другие вызовы этой функции. В результате последующие вызовы функции получат этот общий список, который может быть изменен любыми другими вызовами функции. Хуже того, два параметра используют общий параметр этой функции, в то же время не обращая внимания на изменения, сделанные другим.
Неверный метод (возможно ...):
def foo(list_arg=[5]):
return list_arg
a = foo()
a.append(6)
>>> a
[5, 6]
b = foo()
b.append(7)
# The value of 6 appended to variable 'a' is now part of the list held by 'b'.
>>> b
[5, 6, 7]
# Although 'a' is expecting to receive 6 (the last element it appended to the list),
# it actually receives the last element appended to the shared list.
# It thus receives the value 7 previously appended by 'b'.
>>> a.pop()
7
Вы можете убедиться, что это один и тот же объект, используя id
:
>>> id(a)
5347866528
>>> id(b)
5347866528
Per Brett Slatkin's «Эффективный Python: 59 конкретных способов записи лучшего Python», Пункт 20: Использование None
и Docstrings для указания динамических аргументов по умолчанию (стр. 48)
Соглашение о достижении желаемого результата в Python заключается в предоставлении значения по умолчанию
blockquote>None
и документируйте фактическое поведение в docstring.Эта реализация гарантирует, что каждый вызов функции либо получает список по умолчанию, либо список, переданный функции.
Предпочтительный Метод:
def foo(list_arg=None): """ :param list_arg: A list of input values. If none provided, used a list with a default value of 5. """ if not list_arg: list_arg = [5] return list_arg a = foo() a.append(6) >>> a [5, 6] b = foo() b.append(7) >>> b [5, 7] c = foo([10]) c.append(11) >>> c [10, 11]
В «Неправильном методе» могут быть законные варианты использования, в соответствии с которыми программист предполагает, что параметр списка по умолчанию должен быть общим, но это скорее исключение, чем правило.
GOPATH
обсуждается в документации cmd/go
:
В переменной среды
GOPATH
перечислены места для поиска кода Go. В Unix значение представляет собой строку, разделенную двоеточием. В Windows это значение является разделительной точкой с запятой. В Plan 9 значение - это список.
GOPATH
должен быть установлен для получения, сборки и установки пакетов за пределами стандартного дерева Go.
GOROOT
обсуждается в инструкциях по установке :Бинарные дистрибутивы Go предполагают, что они будут установлены в
/usr/local/go
(илиc:\Go
под Windows), но это возможно для установки инструментов Go в другое место. В этом случае вы должны установить переменную средыGOROOT
, чтобы указать на каталог, в котором она была установлена.Например, если вы установили Go в свой домашний каталог, вы должны добавить следующие команды в
$HOME/.profile
:export GOROOT=$HOME/go export PATH=$PATH:$GOROOT/bin
Примечание:
GOROOT
необходимо установить только при установке в пользовательское местоположение.(обновленная версия Ответ Криса Бунча .)
GOPATH должен not указывать на установку Go, а скорее на ваше рабочее пространство (см. https://golang.org/doc/code.html#GOPATH ). , Всякий раз, когда вы устанавливаете какой-либо пакет с Go Go Go Go Go, он будет приземляться в GOPATH. Вот почему он предупреждает вас, что вы, безусловно, , а не хотите, чтобы случайные пакеты из Интернета были сброшены в вашу официальную установку.
GOPATH
здесь здесь :
Изменена переменная среды
GOPATH
GOPATH
может быть установлена в столбце " разделенный список путей, внутри которых может быть найден код Go, объекты пакета и исполняемые файлы.Установите
GOPATH
для использования goinstall для сборки и установки собственного кода и внешних библиотек за пределами дерева Go (и чтобы избежать написания Make-файлов).И
GOROOT
обсуждается здесь :
$GOROOT
Корень Go дерево, часто$HOME/go
. По умолчанию используется родительский каталог, в котором выполняетсяall.bash
. Если вы решили не устанавливать$GOROOT
, вы должны запускать gomake вместо make или gmake при разработке программ Go с использованием обычных make-файлов.
go env
, вы должны увидеть эту информацию, для меня это было /usr/lib/go/
– Andre
4 February 2013 в 20:38
в osx, я установлен с пивом, вот настройка, которая работает для меня
GOPATH="$HOME/my_go_work_space" //make sure you have this folder created
GOROOT="/usr/local/Cellar/go/1.10/libexec"
Вот моя простая настройка:
directory for go related things: ~/programming/go
directory for go compiler/tools: ~/programming/go/go-1.4
directory for go software : ~/programming/go/packages
GOROOT, GOPATH, PATH установлены следующим образом:
export GOROOT=/home/user/programming/go/go-1.4
export GOPATH=/home/user/programming/go/packages
export PATH=$PATH:$GOROOT/bin:$GOPATH/bin
Итак, короче:
GOROOT предназначен для компилятора / инструментов, которые исходят из установки go. GOPATH предназначен для ваших собственных проектов / сторонних библиотек (загружаемых с помощью «go get»).
Я прочитал документы go help gopath
и по-прежнему невероятно смущен, но нашел этот маленький самородок с другой страницы go doc:
Переменная среды GOPATH указывает местоположение вашей рабочей области. Это, скорее всего, единственная переменная среды, которую вам нужно установить при разработке кода Go.
Если вы используете distro go, вы должны указать, где находятся файлы include, например:
$ rpm -ql golang | grep include
/usr/lib/golang/include
(это для Fedora 20)
Мне пришлось добавить
export GOROOT=/usr/local/Cellar/go/1.10.1/libexec
в мой ~ / .bash_profile в Mac OS X
Как упоминалось выше:
Переменная среды GOPATH указывает местоположение вашей рабочей области.
blockquote>Для Windows это сработало для меня (в Ms- dos):
set GOPATH=D:\my_folder_for_go_code\
Это создает переменную GOPATH, которую Ms-dos распознает при использовании следующим образом:
cd %GOPATH%
В отношении GOROOT
в частности, Go 1.9 автоматически установит его путь установки. Даже если у вас установлено несколько Go, при вызове 1.9.x один из них установит GOROOT
в /path/to/go/1.9
(раньше, если не задано, он предполагал путь по умолчанию, например /usr/local/go
или c:\Go
).
См. CL Go Review 53370 :
Теперь
go tool
будет использовать путь, из которого он был вызван, чтобы попытаться найти корень дерева установки Go. Это означает, что если вся установка Go переместится в новое место,go tool
продолжит работу как обычно.Это может быть переопределено установкой
GOROOT
в среде, которая должна быть только сделано в необычных обстоятельствах. Обратите внимание, что это не влияет на результат функцииruntime.GOROOT()
, который будет продолжать сообщать исходное место установки; это может быть исправлено в последующих выпусках.
Первый запуск go env
. Если вы видите, что установка go не установлена, вы можете установить ее через доморощенный или через пакет и / или другие способы. Если вы видите вывод, ваш выход будет установлен. Он показывает вам все envs, которые установлены и не установлены.
Если вы видите пустое значение для GOROOT
:
which go
(На моем компьютере: /usr/local/go/bin/go
) export GOROOT=/usr/local/go
Если вы видите пустое значение для GOPATH
:
~/GO_PROJECTS
export GOPATH=~/GO_PROJECTS
which go
сделал это для меня. Он использовал другое место для установки с предыдущей установки, используя Chocolatey. Удалил эту папку и удалил ее из переменной PATH. Теперь это работает. Благодаря!
– sgarg
25 May 2016 в 17:57
which go
не работает для меня в Windows 7. Как найти, где я должен запускать эту команду
– firstpostcommenter
4 April 2018 в 12:55
go
, которая необходима для работы с Go. Например, использованиеgoinstall
в OP должно бытьgo get
. – Sonia 1 June 2012 в 16:45/usr/local/Cellar/go/
. В этом случае путь экспорта должен быть установлен с помощьюexport GOROOT=/usr/local/Cellar/go/{version}
иexport PATH=$PATH:$GOROOT/bin
. – ekillaby 4 March 2013 в 18:32export GOROOT=/usr/local/Cellar/go/1.2/libexec/
, чтобы работать с варевом. – Steven Soroka 7 February 2014 в 23:32