Я собираюсь продемонстрировать альтернативную структуру, чтобы передать значение списка по умолчанию функции (она одинаково хорошо работает со словарями).
Поскольку другие подробно комментируют, параметр списка привязан к функции, когда она определена, а не когда она выполняется. Поскольку списки и словари изменяемы, любое изменение этого параметра влияет на другие вызовы этой функции. В результате последующие вызовы функции получат этот общий список, который может быть изменен любыми другими вызовами функции. Хуже того, два параметра используют общий параметр этой функции, в то же время не обращая внимания на изменения, сделанные другим.
Неверный метод (возможно ...):
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]
В «Неправильном методе» могут быть законные варианты использования, в соответствии с которыми программист предполагает, что параметр списка по умолчанию должен быть общим, но это скорее исключение, чем правило.
Origin null
- это локальная файловая система, поэтому вы предполагаете, что загружаете страницу HTML, которая выполняет вызов load
через URL file:///
(например, просто дважды щелкнув его в локальном файловом браузере или похожие). Различные браузеры применяют разные подходы к применению Same Origin Policy к локальным файлам.
Предполагаю, что вы видите это с помощью Chrome. Правила Chrome для применения SOP к локальным файлам очень жесткие, он запрещает даже загрузку файлов из того же каталога, что и документ. Так же и Opera. Некоторые другие браузеры, такие как Firefox, допускают ограниченный доступ к локальным файлам. Но в основном, использование ajax с локальными ресурсами не будет работать в кросс-браузере.
Если вы просто проверяете что-то локально, что вы действительно будете развертывать в Интернете, а не использовать локальные файлы, установите простой веб-сервер и протестируйте его через http://
URL. Это дает вам более точную картину безопасности.
Я хотел бы смиренно добавить, что в соответствии с этим SO-источником: https://stackoverflow.com/a/14671362/1743693 эта проблема теперь частично решена просто путем использования следующих Инструкция jQuery:
<script>
$.support.cors = true;
</script>
Я попробовал это на IE10.0.9200, и он сработал немедленно (используя jquery-1.9.0.js).
На chrome 28.0.1500.95 - это инструкция не работает (это происходит повсюду, поскольку david жалуется на комментарии по ссылке выше)
Запуск chrome с -allow-file-access-from-files сделал не работает для меня (как заявлял Майстора выше)
У Chrome и Safari есть ограничение на использование ajax с локальными ресурсами. Вот почему это бросает ошибку, например
Происхождение null не разрешено Access-Control-Allow-Origin.
blockquote>Решение : Используйте firefox или загрузите данные на временный сервер. Если вы все еще хотите использовать Chrome, запустите его с помощью следующей опции:
--allow-file-access-from-files
Подробнее о том, как добавить указанный выше параметр в свой Chrome: щелкните правой кнопкой мыши значок Chrome на панели задач, щелкните правой кнопкой мыши Google Chrome во всплывающем окне и щелкните свойства и добавьте вышеуказанный параметр в текстовое поле «Цель» на вкладке «Ярлык». Это будет как показано ниже:
C:\Users\XXX_USER\AppData\Local\Google\Chrome\Application\chrome.exe --allow-file-access-from-files
Надеюсь, это поможет!
/Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome --allow-file-access-from-files &
Обратите внимание на окончательный & amp; так что вы можете продолжать использовать терминал и не требуется. ПРИМЕЧАНИЕ: Если вы закроете терминал, он закроет окно Chrome.
– Bruno Bernardino
3 February 2013 в 15:10
Просто хотелось добавить, что ответ «запустить веб-сервер» кажется довольно сложным, но если у вас есть python на вашей системе (установлен по умолчанию, по крайней мере, на MacOS и любой дистрибутив Linux), это так же просто, как:
python -m http.server # with python3
или
python -m SimpleHTTPServer # with python2
Итак, если у вас есть html-файл myfile.html
в папке, скажем mydir
, все, что вам нужно сделать, это:
cd /path/to/mydir
python -m http.server # or the python2 alternative above
Затем укажите браузеру:
http://localhost:8000/myfile.html
И все готово! Работает во всех браузерах без отключения веб-безопасности, разрешения локальных файлов или даже перезапуска браузера с параметрами командной строки.
Добавление бит для использования решения Gokhan для использования:
--allow-file-access-from-files
Теперь вам просто нужно добавить над текстом текст цели, а затем пробел. убедитесь, что вы закрыли все экземпляры браузера Chrome после добавления свойства выше. Теперь перезапустите хром с помощью значка, где вы добавили это свойство. Он должен работать для всех.
$('#result').load('weather.xsl');
), этого не должно произойти, потому что запрос явно имеет то же самое происхождение. Если вы пытаетесь загрузить из другого места (например,$('#result').load('http://somewhere.else/weather.xsl');
), вы снова запускаете SOP, но по-другому. Запросы Ajax ограничены одним и тем же происхождением i> (см. Ссылку в ответе), или если вы используете браузер CORS , и сервер поддерживает COR, сервер может выбрать разрешить ли запрос кросс-происхождения. – T.J. Crowder 11 December 2011 в 14:20python -m SimpleHTTPServer
из командной строки, а затем отправился на localhost: 8000, работал для меня. Python поставляется с предустановленной Mac OS X; вам может потребоваться установить, если вы используете другую ОС. – Dave Liepmann 25 July 2013 в 23:11