mirror of
https://github.com/satwikkansal/wtfpython
synced 2024-11-22 02:54:25 +01:00
Translate Beware of default mutable arguments example
This commit is contained in:
parent
473e4229f2
commit
7ce56da1d8
59
translations/README-ru.md
vendored
59
translations/README-ru.md
vendored
@ -2295,3 +2295,62 @@ print(x, ': x in global')
|
||||
> "Генераторы списков ("list comprehensions") больше не поддерживает синтаксическую форму `[... for var in item1, item2, ...]`. Вместо этого используйте `[... for var in (item1, item2, ...)]`. Кроме того, обратите внимание, что генераторы списков имеют другую семантику: они ближе к синтаксическому сахару для генераторного выражения внутри конструктора `list()`, и, в частности, управляющие переменные цикла больше не просачиваются в окружающую область видимости."
|
||||
|
||||
---
|
||||
|
||||
|
||||
### ▶ Остерегайтесь изменяемых аргументов по умолчанию!
|
||||
<!-- Example ID: 7d42dade-e20d-4a7b-9ed7-16fb58505fe9 --->
|
||||
|
||||
```py
|
||||
def some_func(default_arg=[]):
|
||||
default_arg.append("some_string")
|
||||
return default_arg
|
||||
```
|
||||
|
||||
**Результат:**
|
||||
```py
|
||||
>>> some_func()
|
||||
['some_string']
|
||||
>>> some_func()
|
||||
['some_string', 'some_string']
|
||||
>>> some_func([])
|
||||
['some_string']
|
||||
>>> some_func()
|
||||
['some_string', 'some_string', 'some_string']
|
||||
```
|
||||
|
||||
#### 💡 Объяснение:
|
||||
|
||||
- Изменяемые аргументы функций по умолчанию в Python на самом деле не инициализируются каждый раз, когда вы вызываете функцию. Вместо этого в качестве значения по умолчанию используется недавно присвоенное им значение. Когда мы явно передали `[]` в `some_func в качестве аргумента, значение по умолчанию переменной `default_arg` не было использовано, поэтому функция вернулась, как и ожидалось.
|
||||
|
||||
```py
|
||||
def some_func(default_arg=[]):
|
||||
default_arg.append("some_string")
|
||||
return default_arg
|
||||
```
|
||||
|
||||
**Результат:**
|
||||
```py
|
||||
>>> some_func.__defaults__ # Выражение выведет значения стандартных аргументов фукнции
|
||||
([],)
|
||||
>>> some_func()
|
||||
>>> some_func.__defaults__
|
||||
(['some_string'],)
|
||||
>>> some_func()
|
||||
>>> some_func.__defaults__
|
||||
(['some_string', 'some_string'],)
|
||||
>>> some_func([])
|
||||
>>> some_func.__defaults__
|
||||
(['some_string', 'some_string'],)
|
||||
```
|
||||
|
||||
- Чтобы избежать ошибок, связанных с изменяемыми аргументами, принято использовать `None` в качестве значения по умолчанию, а затем проверять, передано ли какое-либо значение в функцию, соответствующую этому аргументу. Пример:
|
||||
|
||||
```py
|
||||
def some_func(default_arg=None):
|
||||
if default_arg is None:
|
||||
default_arg = []
|
||||
default_arg.append("some_string")
|
||||
return default_arg
|
||||
```
|
||||
|
||||
---
|
||||
|
Loading…
Reference in New Issue
Block a user