Конечно, есть много таких подходов, как синхронный запрос, обещание, но из моего опыта я думаю, что вы должны использовать подход обратного вызова. Естественно, что асинхронное поведение Javascript. Итак, ваш фрагмент кода можно переписать немного иначе:
function foo() {
var result;
$.ajax({
url: '...',
success: function(response) {
myCallback(response);
}
});
return result;
}
function myCallback(response) {
// Does something.
}
В a, b = b, a + b
выражения с правой стороны вычисляются перед назначением левой стороне. Это эквивалентно:
c = a + b
a = b
b = c
Во втором примере значение a
уже было изменено к моменту выполнения b = a + b
. Следовательно, результат отличается.
Надеюсь, что на вас не повлиял язык C, приоритет оператора присваивания =
выше, чем у оператора Comma ,
. Не думайте, что это (a), (b = b), (a + b)
. Это назначение кортежа, что означает (a, b) = (b, a + b)
.
Линия:
a, b = b, a + b
ближе к:
temp_a = a
a = b
b = temp_a + b
, где b
использует старое значение для a
до a
было переназначено значение b
.
Python сначала оценивает правое выражение и сохраняет результаты в стеке, затем берет эти два значения и назначает их a
и b
. Это означает, что a + b
вычисляется до a
.
См. Как происходит замена членов в кортежах python (a, b) = (b , а) работать внутри? для низкого уровня, как все это работает, на уровне байт-кода.
Предположим, что мы начинаем с a
и b
следующим образом:
a = 2
b = 3
Итак, когда вы делаете:
a, b = b, a + b
, что происходит, вы создаете (b, a + b)
или (3, 5)
, а затем распакуйте его в a
и b
, поэтому a
становится 3
, а b
становится 5
.
Во втором примере:
a = b
# a is now 3
b = a + b
# b is 3 + 3, or 6.
Давайте заглянем.
a, b = b, a + b
Это назначение кортежа, означает (a, b) = (b, a + b)
, как (a, b) = (b, a)
Начните с быстрого примера:
a, b = 0, 1
#equivalent to
(a, b) = (0, 1)
#implement as
a = 0
b = 1
Когда приходит к (a, b) = (b, a + b)
EAFP, попробуйте прямо
a, b = 0, 1
a = b #a=b=1
b = a + b #b=1+1
#output
In [87]: a
Out[87]: 1
In [88]: b
Out[88]: 2
Однако
In [93]: a, b = b, a+b
In [94]: a
Out[94]: 3
In [95]: b
Out[95]: 5
Результат отличается от первой попытки.
Tha, потому что Python сначала оценивает правую a+b
. Это эквивалентно:
old_a = a
old_b = b
c = old_a + old_b
a = old_b
b = c
Таким образом, a, b = b, a+b
означает, что a
обменивается, чтобы получить old_value из b
, b
, чтобы получить сумму старого значения a
и старое значение b
,
a, b = b, a + b
аналогичен a, b = 0, 1
, одновременно присваивая значения обеим переменным a, b
. Сначала назначьте a = b
, а затем b = a + b
.
Существуют различия между a, b = b, a + b и a = bb = a + b. Давайте рассмотрим следующие два примера: eg1:
a,b = 0,1
while a<10:
print(a)
a,b = b,a+b
#output:
0
1
1
2
3
5
8
eg2:
a,b = 0,1
while a<10:
print(a)
a=b
b=a+b
#output:
0
1
2
4
8
Это связано с тем, что интерпретатор всегда сначала вычисляет цифры в правой части знака Equals. Результаты вычислений будут присваиваться переменным, которые слева, только если все вычисления выполнены с правой стороны.