Как отметил @FelixKling, наиболее вероятным сценарием является то, что узлы, которые вы ищете, еще не существуют.
Однако современные методы разработки часто могут манипулировать элементами документа за пределами дерева документов либо с DocumentFragments, либо просто отсоединением / повторным подключением текущих элементов напрямую. Такие методы могут использоваться как часть шаблонов JavaScript или для предотвращения чрезмерных операций перерисовки / переплавки, в то время как элементы, о которых идет речь, сильно изменяются.
Аналогично, новая функциональность «Теневой DOM» развертывается в современных браузерах позволяет элементам быть частью документа, но не обрабатываться запросом document.getElementById и всеми его методами sibling (querySelector и т. д.). Это делается для инкапсуляции функциональных возможностей и, в частности, скрыть его.
Опять же, скорее всего, элемент, который вы ищете, просто (пока) в документе, и вы должны сделать, как предлагает Феликс , Тем не менее, вы также должны знать, что это все чаще является не единственной причиной того, что элемент может быть необоснованным (временно или постоянно).
Когда вы делаете
int(math.pow(14764352724, 6))
, вы получаете большое число, возведенное в степень, но используя метод с плавающей запятой, даже если аргументы являются целыми числами. Преобразование в целое число теряет точность (исходный результат - число с плавающей точкой: 1.0358251994780843e+61
)
Когда вы делаете
14764352724**6
, вы получаете большое число, возведенное в степень с использованием двоичного кода метод power , использующий только целочисленное умножение.
Таким образом, второй результат является точным, тогда как первый не является
>>> int(math.pow(14764352724,6))
10358251994780842724998096890217137953445700726699419360034816 # wrong
>>> 14764352724**6
10358251994780842575401275783021915748383652186833068257611776 # correct
Давайте попробуем разобрать функции **
и math.pow
:
import dis,math
def test(n):
return n ** 3
def test2(n):
return math.pow(n,3)
dis.dis(test)
dis.dis(test2)
output
4 0 LOAD_FAST 0 (n)
3 LOAD_CONST 1 (3)
6 BINARY_POWER
7 RETURN_VALUE
7 0 LOAD_GLOBAL 0 (math)
3 LOAD_ATTR 1 (pow)
6 LOAD_FAST 0 (n)
9 LOAD_CONST 1 (3)
12 CALL_FUNCTION 2 (2 positional, 0 keyword pair)
15 RETURN_VALUE
Как видите, функции не эквивалентны. BINARY_POWER
вызывается в первом случае. Эта функция имеет шанс выполнить точное целочисленное умножение , когда параметры целые :
BINARY_POWER ()
Реализует TOS = TOS1 ** TOS
< / blockquote>Двоичная мощность выдает то же значение, что и
math.pow
, когда параметры не все целочисленные:>>> 14764352724**6.0 1.0358251994780843e+61 >>> int(14764352724**6.0) 10358251994780842724998096890217137953445700726699419360034816
Примечание: что, вероятно, добавляет к путанице встроенную [ 1111] метод, который отличается от
math.pow
(и переопределяется последним при использованииfrom math import pow
), но эквивалентен оператору**
при использовании без аргумента по модулю:pow (x, y [, z])
Вернуть x в степень y; если присутствует z, вернуть x в степень y по модулю z (вычисляется более эффективно, чем pow (x, y)% z). Форма двух аргументов pow (x, y) эквивалентна использованию степенного оператора : x ** y.
BLOCKQUOTE>