Translate Let's see if you can guess this? example

This commit is contained in:
Vadim Nifadev 2024-04-22 15:19:58 +03:00
parent f96f5117c5
commit c125f25fb5
1 changed files with 58 additions and 0 deletions

View File

@ -1863,3 +1863,61 @@ str
```
---
### ▶ Посмотрим, сможете ли вы угадать что здесь?
<!-- Example ID: 81aa9fbe-bd63-4283-b56d-6fdd14c9105e --->
```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
```
---