Как работают цепочки назначений?

Цитата из чего-то:

>>> x = y = somefunction() 

такой же как

 >>> y = somefunction() >>> x = y 

Вопрос:

 x = y = somefunction() 

такой же как

 x = somefunction() y = somefunction() 

?

Основываясь на моем понимании, они должны быть одинаковыми, потому что somefunction может вернуть только одно значение.

5 Solutions collect form web for “Как работают цепочки назначений?”

Они не обязательно будут работать одинаково, если somefunction либо somefunction возвращает изменчивое значение. Рассматривать:

 >>> def somefunction(): ... return [] ... >>> x = y = somefunction() >>> x.append(4) >>> x [4] >>> y [4] >>> x = somefunction(); y = somefunction() >>> x.append(3) >>> x [3] >>> y [] 

Ни.

 x = y = some_function() 

эквивалентно

 temp = some_function() x = temp y = temp 

Обратите внимание на порядок. Сначала назначается самая левая цель . (Аналогичное выражение в C может назначаться в противоположном порядке .) В документах по назначению Python :

… присваивает единственный результирующий объект каждому из целевых списков слева направо.

Разборка показывает это:

 >>> def chained_assignment(): ... x = y = some_function() ... >>> import dis >>> dis.dis(chained_assignment) 2 0 LOAD_GLOBAL 0 (some_function) 3 CALL_FUNCTION 0 6 DUP_TOP 7 STORE_FAST 0 (x) 10 STORE_FAST 1 (y) 13 LOAD_CONST 0 (None) 16 RETURN_VALUE 

ОСТОРОЖНО: тот же объект всегда присваивается каждой цели. Так как @Wilduck и @andronikus указывают, вы, вероятно, никогда этого не хотите:

 x = y = [] # Wrong. 

В приведенном выше случае x и y относятся к одному и тому же списку. Поскольку списки изменяемы , добавление к x, по- видимому, влияет на y.

 x = [] # Right. y = [] 

Теперь у вас есть два имени, относящихся к двум различным пустым спискам.

Что делать, если somefunction() возвращает разные значения при каждом вызове?

 import random x = random.random() y = random.random() 

В

 x = somefunction() y = somefunction() 

somefunction будет вызываться дважды, а не один раз.

Даже если он каждый раз возвращает один и тот же результат, это будет заметно, если требуется вернуть минуту! Или, если у него есть побочный эффект, например, попросить пользователя ввести его пароль.

Это приведет к тому же, только если функция не имеет побочных эффектов и возвращает один элемент детерминированным образом (учитывая его входные данные).

Например:

 def is_computer_on(): return True x = y = is_computer_on() 

или

 def get_that_constant(): return some_immutable_global_constant 

Обратите внимание, что результат будет таким же, но процесс достижения результата не будет:

 def slow_is_computer_on(): sleep(10) return True 

Содержимое переменных x и y будет одинаковым, но инструкция x = y = slow_is_computer_on() будет длиться 10 секунд, а ее аналог x = slow_is_computer_on() ; y = slow_is_computer_on() x = slow_is_computer_on() ; y = slow_is_computer_on() длится 20 секунд.

Это было бы почти то же самое, если функция не имеет побочных эффектов и возвращает неизменяемую детерминированную манеру (учитывая ее входные данные).

Например:

 def count_three(i): return (i+1, i+2, i+3) x = y = count_three(42) 

Обратите внимание, что применяются те же уловы, которые описаны в предыдущем разделе.

Почему я говорю почти ? Из-за этого:

 x = y = count_three(42) x is y # <- is True x = count_three(42) y = count_three(42) x is y # <- is False 

Хорошо, использование is это что-то странное, но это иллюстрирует, что возврат не является тем же. Это важно для изменяемого случая:

Это опасно и может привести к ошибкам, если функция возвращает изменчивый

На этот вопрос также ответили. Ради полноты я воспроизвожу аргумент:

 def mutable_count_three(i): return [i+1, i+2, i+3] x = y = mutable_count_three(i) 

Поскольку в этом сценарии x и y являются одним и тем же объектом, выполнение операции типа x.append(42) означает, что и x и y содержат ссылку на список, который теперь имеет 4 элемента.

Было бы совсем не так, если функция имеет побочные эффекты

Учитывая печать побочного эффекта (который я нахожу действительным, но вместо этого можно использовать другие примеры):

 def is_computer_on_with_side_effect(): print "Hello world, I have been called!" return True x = y = is_computer_on_with_side_effect() # One print # The following are *two* prints: x = is_computer_on_with_side_effect() y = is_computer_on_with_side_effect() 

Вместо печати это может быть более сложный или более тонкий побочный эффект, но факт остается фактом: метод вызывается один или два раза, что может привести к разному поведению.

Было бы совсем не так, если функция не детерминирована с учетом ее входных данных

Возможно, простой случайный метод:

 def throw_dice(): # This is a 2d6 throw: return random.randint(1,6) + random.randint(1,6) x = y = throw_dice() # x and y will have the same value # The following may lead to different values: x = throw_dice() y = throw_dice() 

Но вещи, связанные с часами, глобальными счетчиками, системными материалами и т. Д., Разумны для того, чтобы быть недетерминированными с учетом ввода, и в этих случаях значение x и y может расходиться.

  • Неожиданное поведение itertools.groupby
  • Необработанное исключение в потоке запущено python manage.py runningerver
  • Как вы используете subprocess.check_output () в Python?
  • Список блокировок
  • Альтернатива execfile в Python 3?
  • Угадайте номер игры с разными именами угадывания
  • Процесс против потока в отношении использования Queue () / deque () и переменной класса для связи и «ядовитой таблетки»
  • Диспетчерские нажатия клавиш для встроенного Pygame
  • Как применить функцию к каждому подсписку списка в python?
  • Почему я получаю «python int too large to convert to C long», когда я использую DateFormatter от matplotlib для форматирования дат на оси x?
  • Количество пирамид, вложенных в цикл
  •  
    Interesting Posts for Van-Lav

    Google App Engine – как разделить код на несколько файлов? (веб – приложение)

    Как написать Django QuerySet правильно вычисляет среднее значение DateTimeField с группировкой?

    Как посмотреть сеанс xvfb, находящийся внутри докера на удаленном сервере, из моего локального браузера?

    Выполнение парного вычисления расстояния с помощью TensorFlow

    Как редактировать несколько элементов в df.columns

    Запись в отдельные столбцы вместо запятой, разделенной на файлы csv в scrapy

    Python lib для чтения файла формата swf swf

    Предложения по манипулированию SVG-картой

    Получить адреса локального сетевого интерфейса, используя только proc?

    Почему Исключения являются итерабельными?

    В Python, как наиболее эффективно вырезать строку UTF-8 для доставки REST?

    Определение повторяющихся значений в массиве

    Лучший способ для чтения новых строк с разделителями в Python и отбрасывания новых строк?

    в чем причина использования _defaults и лямбда в python для разработки openerp?

    Остановить прокрутку в динамической странице с помощью Selenium в Python

    Python - лучший язык программирования в мире.