Есть еще одна проблема, которая не указана ни в одном из существующих ответов. Python разрешено объединять любые два неизменных значения, и предварительно созданные значения малых значений не являются единственным способом, которым это может случиться. Реализация Python никогда не гарантирована , но все они делают это не более, чем просто малые int.
Во-первых, есть еще некоторые предварительно созданные такие как пустые tuple
, str
и bytes
и некоторые короткие строки (в CPython 3.6 это 256 односимвольных строк Latin-1). Например:
>>> a = ()
>>> b = ()
>>> a is b
True
Но также даже не созданные заранее значения могут быть одинаковыми. Рассмотрим следующие примеры:
>>> c = 257
>>> d = 257
>>> c is d
False
>>> e, f = 258, 258
>>> e is f
True
И это не ограничено значениями int
:
>>> g, h = 42.23e100, 42.23e100
>>> g is h
True
Очевидно, что CPython не поставляется с предварительно созданным float
для параметра 42.23e100
. Итак, что здесь происходит?
Компилятор CPython будет объединять постоянные значения некоторых известных неизменяемых типов, таких как int
, float
, str
, bytes
, в одном модуле компиляции. Для модуля весь модуль является единицей компиляции, но в интерактивном интерпретаторе каждый оператор представляет собой отдельный блок компиляции. Поскольку c
и d
определены в отдельных утверждениях, их значения не объединяются. Поскольку e
и f
определены в том же самом заявлении, их значения сливаются.
Вы можете видеть, что происходит, разобрав байт-код. Попробуйте определить функцию, которая выполняет e, f = 128, 128
, а затем называет dis.dis
на ней, и вы увидите, что существует одно постоянное значение (128, 128)
>>> def f(): i, j = 258, 258
>>> dis.dis(f)
1 0 LOAD_CONST 2 ((128, 128))
2 UNPACK_SEQUENCE 2
4 STORE_FAST 0 (i)
6 STORE_FAST 1 (j)
8 LOAD_CONST 0 (None)
10 RETURN_VALUE
>>> f.__code__.co_consts
(None, 128, (128, 128))
>>> id(f.__code__.co_consts[1], f.__code__.co_consts[2][0], f.__code__.co_consts[2][1])
4305296480, 4305296480, 4305296480
. Вы можете заметить, что компилятор сохранил 128
как константу, даже если он фактически не используется байтовым кодом, что дает вам представление о том, как мало оптимизирует компилятор CPython. Это означает, что (непустые) кортежи на самом деле не сливаются:
>>> k, l = (1, 2), (1, 2)
>>> k is l
False
Поместите это в функцию, dis
, и посмотрите на co_consts
- есть 1
и 2
, два (1, 2)
кортежа, которые имеют одинаковые 1
и 2
, но не идентичны, и кортеж ((1, 2), (1, 2))
, который имеет два разных одинаковых кортежа.
Есть еще одна оптимизация, которую выполняет CPython: string interning. В отличие от сгибания константы компилятора, это не ограничивается литералами исходного кода:
>>> m = 'abc'
>>> n = 'abc'
>>> m is n
True
С другой стороны, он ограничен типом str
и строками типа внутреннего хранилища «ascii compact», «compact» или «legacy ready» , и во многих случаях только «ascii compact» будет интернирован.
Во всяком случае, правила для чего значения должны быть, могут быть или не могут отличаться от реализации до реализации, а также между версиями одной и той же реализации и, возможно, даже между прогонами одного и того же кода в одной и той же копии одной и той же реализации.
Возможно, стоит изучить правила для одного конкретного Python для удовольствия. Но не стоит полагаться на них в вашем коде. Единственное безопасное правило:
Или, другими словами, использовать is
только для проверки документированных синглетов (например, None
) или которые создаются только в одном месте в код (например, идиома _sentinel = object()
).
Вы могли использовать jQuery. Вот пример: http://www.jqueryplugins.com/plugin/47/
Я был бы сильно , предлагают, чтобы Вы использовали суперрыба , адаптация jQuery меню suckerfish. Это имеет загрузки функций (и задержка является одним из них), добавляют некоторые необычные возможности анимации и ухудшаются к нормальному меню suckerfish корректно. Этому также не нужна никакая дополнительная разметка.
Вы не сможете получить чистое выпадающее меню CSS с функциональностью, которой Вы требуете. Необходимо будет использовать некоторый JavaScript. Или библиотека как JQuery, который был упомянут или путем изменения кода Suckerfish для использования onclick вместо onmouseover/out.
, Но путем хождения всем путем JavaScript Вы могли помогать одной группе людей ("пользователи с трудностями с координацией"), но мешать другим (любой с JavaScript, выключенным по некоторым причинам).
можно хотеть изучить добавление некоторых альтернатив - мышь управляемое меню при наведении курсора для довольных мышью; основанное на клавиатуре управление через ключи доступа и т.п. для других.
Я использую решение, реализованное на сайте Steve Gibson grc.com . Это делает все, в чем я нуждаюсь, и использование никакой javascript. Вещь задержки, которую Вы ищете, не там однако, таким образом, необходимо будет, вероятно, добавить некоторый JavaScript для этого.
Я не вижу способ добавить задержку за пределами JavaScript - но если Вы собираетесь использовать JavaScript, можно также использовать управляемое меню JavaScript.
, Если Вы следуете за семантически корректным военно-морским шаблоном и настраиваете его так он дисплей обычно (например, статичный), когда JavaScript не присутствует, необходимо согласиться с тем, что Вы используете.
Это - все о Вашей целевой аудитории - кто является более крупным? JS-disabled или пользователи с трудностями с координацией? Я предположил бы, что последние требуют приоритета (если бы не использование процента затем законы о нетрудоспособности).
Часть проблемы координации может произойти от плохого дизайна. Удостоверьтесь, что у Вас есть довольно большие кнопки с, если это возможно, перекрытие на всех сторонах. Идеально главная военно-морская кнопка имела бы выпадающее меню, кажущееся центрируемой ниже его (вместо выровненного по левому краю). Подменю выпадающего следовали бы за подобным шаблоном. Я нашел, что наличие этого уровня ошибочного дополнения размещает нескоординированных пользователей и избавляет Вас от необходимости программировать в JavaScript.
Каждый сайт отличается, конечно, таким образом, я представляю это больше как альтернативу 'что - если' решение.
Как Lee Theobald сказал, отбрасывание/вниз нуждаются в JavaScript, и JQuery является большим выбором. Но в стороне доступности, смотрите на" Listamatic" большой список меню и особенный , это вложило .
Моя первая рекомендация echos один уже сделанный - Меню CSS Steve Gibson. Это не использует JavaScript, почти столь межплатформенный совместимый, как Вы собираетесь добраться, и относительно просто реализовать.
, Если это не работает, мой основанный на JS reccomendation переходит в mygosuMenu. Я использовал его в течение достаточно долгого времени на всех моих проектах до нахождения меню Steve. Его высоконастраиваемое; и стиль, структура и код меню являются все отдельными. Это - основная HTML-таблица, которую можно разработать с помощью CSS к содержанию основы.
я все еще получил два сайта с помощью последнего: