Идиома Python для этого - newList = oldList[:]
В операторе присваивания правая часть всегда оценивается полностью перед , выполняя фактическую настройку переменных. Итак,
x, y = y, x + y
оценивает y
(назовем результат ham
), оценивает x + y
(назовем это spam
), , затем устанавливает x
на ham
и y
до spam
. Т.е. это
ham = y
spam = x + y
x = ham
y = spam
. Напротив,
x = y
y = x + y
устанавливает x
в y
, затем устанавливает y
на x
(который == y
) плюс y
, поэтому он эквивалентен
x = y
y = y + y
Недавно я начал использовать Python, и эта «функция» сбила меня с толку.
Если я хочу поменять значения двух переменных, в JavaScipt я бы сделал следующее:
var a = 0;
var b = 1;
var temp = a;
a = b;
b = temp;
Мне понадобится третья переменная, чтобы временно удерживать одно из значений. Очень простой обмен не будет работать, потому что обе переменные будут иметь одинаковое значение.
var a = 0;
var b = 1;
a = b; // b = 1 => a = 1
b = a; // a = 1 => b = 1
Представьте, что у вас два разных (красных и синих) ведра и две разные жидкости (вода и масло) в них, соответственно. Теперь попробуйте поменять ведра / жидкости (вода в синем и масло в красном ведре). Вы не можете сделать это, если у вас нет дополнительного ведра.
Python занимается этим с помощью «более чистого» способа / решения: Назначение набора .
a = 0
b = 1
print(a, b) # 0 1
# temp = a
# a = b
# b = temp
a, b = b, a # values are swapped
print(a, b) # 1 0
Я думаю, таким образом Python автоматически создает переменные «temp», и нам не о чем беспокоиться.
Во втором случае вы назначаете x+y
на x
. В первом случае второй результат (x+y
) присваивается y
Вот почему вы получаете разные результаты.
После редактирования
Это происходит потому, что в заявлении
x,y = y,x+y
оцениваются все переменные в правой части и затем сохраняются в левых членах. Итак, сначала приступим к правильному члену, а второй - к левому элементу.
Во втором утверждении
x = y
y = x + y
yo сначала оценили y
и назначили его x
; Таким образом, сумма x+y
эквивалентна сумме y+y
, а не x+x
, которая является первым случаем.
Давайте разглядеть разницу.
x, y = y, x + y
Это x tuple xssignment, mexns (x, y) = (y, x + y)
, как (x, y) = (y, x)
Stxrt из x быстрого примера:
x, y = 0, 1
#equivxlent to
(x, y) = (0, 1)
#implement xs
x = 0
y = 1
Когда вы дойдете до (x, y) = (y, x + y)
ExFP, попробуйте x напрямую
x, y = 0, 1
x = y #x=y=1
y = x + y #y=1+1
#output
In [87]: x
Out[87]: 1
In [88]: y
Out[88]: 2
Однако
In [93]: x, y = y, x+y
In [94]: x
Out[94]: 3
In [95]: y
Out[95]: 5
Результат отличается от первой попытки.
Thx, потому что Python сначала оценивает правую x+y
. Так что это равносильно:
old_x = x
old_y = y
c = old_x + old_y
x = old_y
y = c
Таким образом, x, y = y, x+y
означает, что x
обменивается, чтобы получить old_value из y
, y
обменивается, чтобы получить сумму старого значения x
и старое значение y
,
a, b = 0, 1
while b < 10:
print(b)
a, b = b, a+b
Выход
1
1
2
3
5
8
переменные a и b одновременно получают новые значения 0 и 1, то же a, b = b, a + b, a и b назначаются одновременно.
Первое является назначением типа кортежа:
x,y = y,x+y
Где x
- первый элемент кортежа, а y
- второй элемент, таким образом, вы делаете это :
x = y
y = x+y
. Второй выполняет прямое назначение:
x=y
x=x+y
x = y
, y = x+y
, набирает его в python :)
– Serdalis
4 January 2012 в 13:06
Это объясняется в документах раздела «Порядок оценки» :
... при оценке присвоения правая часть оценивается перед левой стороной.