Я собираюсь продемонстрировать альтернативную структуру, чтобы передать значение списка по умолчанию функции (она одинаково хорошо работает со словарями).
Поскольку другие подробно комментируют, параметр списка привязан к функции, когда она определена, а не когда она выполняется. Поскольку списки и словари изменяемы, любое изменение этого параметра влияет на другие вызовы этой функции. В результате последующие вызовы функции получат этот общий список, который может быть изменен любыми другими вызовами функции. Хуже того, два параметра используют общий параметр этой функции, в то же время не обращая внимания на изменения, сделанные другим.
Неверный метод (возможно ...):
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]
В «Неправильном методе» могут быть законные варианты использования, в соответствии с которыми программист предполагает, что параметр списка по умолчанию должен быть общим, но это скорее исключение, чем правило.
Попробуйте:
var os = navigator.platform;
Затем обрабатывайте переменную os соответственно для вашего результата.
Вы также можете прокручивать каждый объект из navigator
, чтобы помочь вам лучше ознакомиться с объектами:
<script type="text/javascript">
for(var i in navigator){
console.log(i+"="+navigator[i]+'<br>');
}
</script>
Попробуйте:
alert(navigator.appVersion);
Это должно дать вам строку, которую вы можете проанализировать для ОС.
<script>
osName = 'Unknown';
function nav(x, y, z) {
z = z || y;
if (navigator[x] && navigator[x].indexOf(y) !== -1) {
osName = z;
}
}
/* navigator value download */
nav( "appVersion", "X11", "UNIX" );
nav( "appVersion", "Mac", "MacOS" );
nav( "appVersion", "Linux" );
nav( "userAgent", "Linux" );
nav( "platform", "Linux" );
nav( "appVersion", "Win", "Windows" );
nav( "userAgent", "Windows" );
nav( "platform", "Win", "Windows" );
nav( "oscpu", "Windows" );
document.getElementById("download"+osName).className = "knownOS";
</script>
Убедитесь, что правильная ссылка для загрузки легко найти, но не скрывает другие ссылки на ОС. Люди могут все еще хотеть их.
<style>
#downloadUNIX, #downloadMacOS, #downloadLinux, #downloadWindows {
color:#6D94F2;
line-height:35px;
margin:24px 0 24px 0;
padding:10px;
}
.knownOS {
background-color:#F7ECAD !important;
border:2px solid #E8913A;
color:#133CC4 !important;
font-weight:bold;
}
</style>
И некоторые html
<ul>
<li><a id="downloadUNIX" href="unix Link Here" >Download Napster-9000 for UNIX</a></li>
<li><a id="downloadWindows" href="windows Link Here">Download Napster-9000 for Windows</a></li>
<li><a id="downloadMacOS" href="mac os link here" >Download Napster-9000 for OS X</a></li>
<li><a id="downloadLinux" href="linux Link Here" >Download Napster-9000 for Linux</a></li>
</ul>
Теперь пользователь может отключить или заблокировать javascripts, если захочет. Ссылки будут по-прежнему присутствовать, а не писать ссылки с Javascript, что требует работы javascript.
Вот скрипка
Обычный JavaScript может быть всем, что вам нужно.
var OSName="Unknown OS";
if (navigator.appVersion.indexOf("Win")!=-1) OSName="Windows";
if (navigator.appVersion.indexOf("Mac")!=-1) OSName="MacOS";
if (navigator.appVersion.indexOf("X11")!=-1) OSName="UNIX";
if (navigator.appVersion.indexOf("Linux")!=-1) OSName="Linux";
document.write('Your OS: '+OSName);
Так как Ник предположил, что вы также можете использовать navigator.platform
.
navigator.platform
?
– NickAldwin
12 August 2011 в 19:58
navigator.platform
устарел. Проверьте developer.mozilla.org/en-US/docs/Web/API/NavigatorID.platform
– Lucas Rossini
3 December 2014 в 20:47
Насколько я знаю, platform
является менее поддельным свойством в объекте навигатора. Вы можете использовать это, чтобы получить booleans.
var isMac = navigator.platform.toUpperCase().indexOf('MAC')!==-1;
var isWindows = navigator.platform.toUpperCase().indexOf('WIN')!==-1;
var isLinux = navigator.platform.toUpperCase().indexOf('LINUX')!==-1;
Если вам нужно отличать Mac от старого PowerPc и нового Intel.
var isMacPpc=navigator.platform==="MacPPC";
var isMacIntel=navigator.platform==="MacIntel";
https: // разработчик .mozilla.org / о / DOM / window.navigator.platform