mirror of
https://github.com/satwikkansal/wtfpython
synced 2024-11-21 18:54:20 +01:00
Translate Let's see if you can guess this? example
This commit is contained in:
parent
f96f5117c5
commit
c125f25fb5
58
translations/README-ru.md
vendored
58
translations/README-ru.md
vendored
@ -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
|
||||
```
|
||||
|
||||
---
|
||||
|
Loading…
Reference in New Issue
Block a user