Как работает двойное задание? [Дубликат]

Идиома Python для этого - newList = oldList[:]

32
задан Rob Bednark 9 September 2014 в 23:47
поделиться

8 ответов

В операторе присваивания правая часть всегда оценивается полностью перед , выполняя фактическую настройку переменных. Итак,

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
50
ответ дан Fred Foo 21 August 2018 в 08:12
поделиться

Недавно я начал использовать 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», и нам не о чем беспокоиться.

0
ответ дан akinuri 21 August 2018 в 08:12
поделиться

Во втором случае вы назначаете 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, которая является первым случаем.

1
ответ дан DonCallisto 21 August 2018 в 08:12
поделиться

Давайте разглядеть разницу.

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,

0
ответ дан JawSaw 21 August 2018 в 08:12
поделиться
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 назначаются одновременно.

0
ответ дан li bing zhao 21 August 2018 в 08:12
поделиться

Первое является назначением типа кортежа:

x,y = y,x+y

Где x - первый элемент кортежа, а y - второй элемент, таким образом, вы делаете это :

x = y
y = x+y

. Второй выполняет прямое назначение:

x=y
x=x+y
4
ответ дан the Tin Man 21 August 2018 в 08:12
поделиться
  • 1
    они не эквивалентны, первый делает x = y, y = x+y, набирает его в python :) – Serdalis 4 January 2012 в 13:06
  • 2
    @Serdalis Як я пропустил это – Abhijit 4 January 2012 в 13:08
  • 3
    Спасибо!! Ваш ответ и ответ @Iarsmans были очень ясны: P – rafuru 4 January 2012 в 13:27

Это объясняется в документах раздела «Порядок оценки» :

... при оценке присвоения правая часть оценивается перед левой стороной.

8
ответ дан unutbu 21 August 2018 в 08:12
поделиться
4
ответ дан the Tin Man 1 November 2018 в 03:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: