diff --git a/translations/README-ru.md b/translations/README-ru.md index e032170..2c35c8f 100644 --- a/translations/README-ru.md +++ b/translations/README-ru.md @@ -1863,3 +1863,61 @@ str ``` --- + + +### ▶ Посмотрим, сможете ли вы угадать что здесь? + +```py +a, b = a[b] = {}, 5 +``` + +**Результат:** +```py +>>> a +{5: ({...}, 5)} +``` + +#### 💡 Объяснение: + +* Согласно [документации](https://docs.python.org/3/reference/simple_stmts.html#assignment-statements), выражения присваивания имеют вид + ``` + (target_list "=")+ (expression_list | yield_expression) + ``` + и + +> Оператор присваивания исполняет список выражений (помните, что это может быть одно выражение или список, разделенный запятыми, в последнем случае получается кортеж) и присваивает единственный результирующий объект каждому из целевых списков, слева направо. + +* `+` в `(target_list "=")+` означает, что может быть **один или более** целевых списков. В данном случае целевыми списками являются `a, b` и `a[b]` (обратите внимание, что список выражений ровно один, в нашем случае это `{}, 5`). + +* После исполнения списка выражений его значение распаковывается в целевые списки **слева направо**. Так, в нашем случае сначала кортеж `{}, 5` распаковывается в `a, b`, и теперь у нас есть `a = {}` и `b = 5`. + +* Теперь `a` имеет значение `{}`, которое является изменяемым объектом. + +* Вторым целевым списком является `a[b]` (вы можете ожидать, что это вызовет ошибку, поскольку `a` и `b` не были определены в предыдущих утверждениях. Но помните, мы только что присвоили `a` значение `{}` и `b` - `5`). + +* Теперь мы устанавливаем ключ `5` в словаре в кортеж `({}, 5)`, создавая круговую ссылку (`{...}` в выводе ссылается на тот же объект, на который уже ссылается `a`). Другим более простым примером круговой ссылки может быть + +```py + >>> some_list + [[...]] + >>> some_list[0] + [[...]] + >>> some_list is some_list[0] + True + >>> some_list[0][0][0][0][0][0] == some_list + True + ``` + Аналогичный случай в примере выше (`a[b][0]` - это тот же объект, что и `a`) + +* Подводя итог, можно разбить пример на следующие пункты + ```py + a, b = {}, 5 + a[b] = a, b + ``` + А циклическая ссылка может быть оправдана тем, что `a[b][0]` - тот же объект, что и `a` + ```py + >>> a[b][0] is a + True + ``` + + ---