What the f*ck Python! 😱

Π˜Π·ΡƒΡ‡Π΅Π½ΠΈΠ΅ ΠΈ ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΠ΅ Python с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ нСстандартного повСдСния ΠΈ "магичСского" повСдСния.

ΠŸΠ΅Ρ€Π΅Π²ΠΎΠ΄Ρ‹: [English Original](https://github.com/satwikkansal/wtfpython) [Chinese δΈ­ζ–‡](https://github.com/robertparley/wtfpython-cn) | [Vietnamese TiαΊΏng Việt](https://github.com/vuduclyunitn/wtfptyhon-vi) | [Spanish EspaΓ±ol](https://web.archive.org/web/20220511161045/https://github.com/JoseDeFreitas/wtfpython-es) | [Korean ν•œκ΅­μ–΄](https://github.com/buttercrab/wtfpython-ko) | [Russian Русский](https://github.com/nifadyev/wtfpython/tree/main/translations/README-ru.md) | [German Deutsch](https://github.com/BenSt099/wtfpython) | [Add translation](https://github.com/satwikkansal/wtfpython/issues/new?title=Add%20translation%20for%20[LANGUAGE]&body=Expected%20time%20to%20finish:%20[X]%20weeks.%20I%27ll%20start%20working%20on%20it%20from%20[Y].) ΠΠ»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π½Ρ‹Π΅ способы: [Π˜Π½Ρ‚Π΅Ρ€Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹ΠΉ сайт](https://wtfpython-interactive.vercel.app) | [Π˜Π½Ρ‚Π΅Ρ€Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹ΠΉ Jupiter notebook](https://colab.research.google.com/github/satwikkansal/wtfpython/blob/master/irrelevant/wtf.ipynb) | [CLI](https://pypi.python.org/pypi/wtfpython) Python, Π±ΡƒΠ΄ΡƒΡ‡ΠΈ прСкрасно спроСктированным высокоуровнСвым языком программирования, прСдоставляСт мноТСство возмоТностСй для удобства программиста. Но ΠΈΠ½ΠΎΠ³Π΄Π° Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ Ρ€Π°Π±ΠΎΡ‚Ρ‹ Python ΠΊΠΎΠ΄Π° ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ Π½Π΅ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½Ρ‹ΠΌΠΈ Π½Π° ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ взгляд. **wtfpython** Π·Π°Π΄ΡƒΠΌΠ°Π½ ΠΊΠ°ΠΊ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚, ΠΏΡ‹Ρ‚Π°ΡŽΡ‰ΠΈΠΉΡΡ ΠΎΠ±ΡŠΡΡΠ½ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΈΠΌΠ΅Π½Π½ΠΎ происходит ΠΏΠΎΠ΄ ΠΊΠ°ΠΏΠΎΡ‚ΠΎΠΌ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π½Π΅ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½Ρ‹Ρ… Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ΠΎΠ² ΠΊΠΎΠ΄Π° ΠΈ ΠΌΠ΅Π½Π΅Π΅ извСстных возмоТностСй Python. Если Π²Ρ‹ ΠΎΠΏΡ‹Ρ‚Π½Ρ‹ΠΉ программист Π½Π° Python, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΡ€ΠΈΠ½ΡΡ‚ΡŒ это ΠΊΠ°ΠΊ Π²Ρ‹Π·ΠΎΠ² ΠΈ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ ΠΎΠ±ΡŠΡΡΠ½ΠΈΡ‚ΡŒ WTF ситуации с ΠΏΠ΅Ρ€Π²ΠΎΠΉ ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠΈ. Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π²Ρ‹ ΡƒΠΆΠ΅ ΡΡ‚Π°Π»ΠΊΠΈΠ²Π°Π»ΠΈΡΡŒ с Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ ΠΈΠ· Π½ΠΈΡ… Ρ€Π°Π½ΡŒΡˆΠ΅, ΠΈ я смогу ΠΎΠΆΠΈΠ²ΠΈΡ‚ΡŒ ваши старыС Π΄ΠΎΠ±Ρ€Ρ‹Π΅ воспоминания! πŸ˜… PS: Если Π²Ρ‹ ΡƒΠΆΠ΅ Ρ‡ΠΈΡ‚Π°Π»ΠΈ **wtfpython** Ρ€Π°Π½ΡŒΡˆΠ΅, с измСнСниями ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ·Π½Π°ΠΊΠΎΠΌΠΈΡ‚ΡŒΡΡ [здСсь](https://github.com/satwikkansal/wtfpython/releases/) (ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹, ΠΎΡ‚ΠΌΠ΅Ρ‡Π΅Π½Π½Ρ‹Π΅ Π·Π²Π΅Π·Π΄ΠΎΡ‡ΠΊΠΎΠΉ - это ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹, Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π½Ρ‹Π΅ Π² послСднСй основной Ρ€Π΅Π΄Π°ΠΊΡ†ΠΈΠΈ). Ну Ρ‡Ρ‚ΠΎ ΠΆ, приступим... # Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠ°Π½ΠΈΠ΅ - [Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠ°Π½ΠΈΠ΅](#содСрТаниС) - [Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°](#структура-ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°) - [ΠŸΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅](#ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅) - [πŸ‘€ ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹](#-ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹) - [БСкция: Напряги ΠΌΠΎΠ·Π³ΠΈ!](#сСкция-напряги-ΠΌΠΎΠ·Π³ΠΈ) - [β–Ά ΠŸΠ΅Ρ€Π²Ρ‹ΠΌ Π΄Π΅Π»ΠΎΠΌ!](#-ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ-Π΄Π΅Π»ΠΎΠΌ) - [πŸ’‘ ОбьяснСниС](#-обьяснСниС) - [β–Ά Π‘Ρ‚Ρ€ΠΎΠΊΠΈ ΠΈΠ½ΠΎΠ³Π΄Π° Π²Π΅Π΄ΡƒΡ‚ сСбя нСпрСдсказуСмо](#-строки-ΠΈΠ½ΠΎΠ³Π΄Π°-Π²Π΅Π΄ΡƒΡ‚-сСбя-нСпрСдсказуСмо) - [πŸ’‘ ОбъяснСниС](#-объяснСниС) # Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° ВсС ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ ΠΈΠΌΠ΅ΡŽΡ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ структуру: > ### β–Ά Какой-Ρ‚ΠΎ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ > > ```py > # НСочСвидный Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ ΠΊΠΎΠ΄Π° > # ΠŸΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΊΠ° ΠΊ ΠΌΠ°Π³ΠΈΠΈ... > ``` > > **Π’Ρ‹Π²ΠΎΠ΄ (Python вСрсия):** > > ```py > >>> triggering_statement > НСоТиданныС Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ > ``` > > (ΠžΠΏΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎ): ΠšΡ€Π°Ρ‚ΠΊΠΎΠ΅ описаниС Π½Π΅ΠΎΠΆΠΈΠ΄Π°Π½Π½ΠΎΠ³ΠΎ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π° > > > #### πŸ’‘ ОбъяснСниС > > * ΠšΡ€Π°Ρ‚ΠΊΠΎΠ΅ объяснСниС Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ происходит ΠΈ ΠΏΠΎΡ‡Π΅ΠΌΡƒ это происходит. > > ```py > # Код > # Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ для дальнСйшСго Ρ€Π°Π·ΡŠΡΡΠ½Π΅Π½ΠΈΡ (Ссли Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ) > ``` > > **Π’Ρ‹Π²ΠΎΠ΄ (Python вСрсия):** > > ```py > >>> trigger # ΠΊΠ°ΠΊΠΎΠΉ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰ΠΈΠΉ Π»Π΅Π³ΠΊΠΎ Ρ€Π°ΡΠΊΡ€Ρ‹Ρ‚ΡŒ магию > # обоснованный Π²Ρ‹Π²ΠΎΠ΄ > ``` **Π’Π°ΠΆΠ½ΠΎ:** ВсС ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ протСстированы Π½Π° ΠΈΠ½Ρ‚Π΅Ρ€Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΠΌ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€Π΅ Python 3.5.2, ΠΈ ΠΎΠ½ΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ для всСх вСрсий Python, Ссли это явно Π½Π΅ ΡƒΠΊΠ°Π·Π°Π½ΠΎ ΠΏΠ΅Ρ€Π΅Π΄ Π²Ρ‹Π²ΠΎΠ΄ΠΎΠΌ. # ΠŸΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Π₯ΠΎΡ€ΠΎΡˆΠΈΠΉ способ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡŒΠ½ΡƒΡŽ ΠΏΠΎΠ»ΡŒΠ·Ρƒ ΠΎΡ‚ этих ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ² - Ρ‡ΠΈΡ‚Π°Ρ‚ΡŒ ΠΈΡ… ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, ΠΏΡ€ΠΈΡ‡Π΅ΠΌ для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΈΠ· Π½ΠΈΡ… Π²Π°ΠΆΠ½ΠΎ: - Π’Π½ΠΈΠΌΠ°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΠΈΠ·ΡƒΡ‡ΠΈΡ‚ΡŒ исходный ΠΊΠΎΠ΄. Если Π²Ρ‹ ΠΎΠΏΡ‹Ρ‚Π½Ρ‹ΠΉ программист Π½Π° Python, Ρ‚ΠΎ Π² Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π΅ случаСв смоТСтС ΠΏΡ€Π΅Π΄ΡƒΠ³Π°Π΄Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΠ΄Π΅Ρ‚ дальшС. - ΠŸΡ€ΠΎΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚Ρ‹ Π²Ρ‹Π²ΠΎΠ΄Π° ΠΈ, - ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ, ΡΠΎΠ²ΠΏΠ°Π΄Π°ΡŽΡ‚ Π»ΠΈ Π²Ρ‹Ρ…ΠΎΠ΄Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ с вашими оТиданиями. - Π£Π±Π΅Π΄ΠΈΡ‚ΡŒΡΡ, Ρ‡Ρ‚ΠΎ Π²Ρ‹ Π·Π½Π°Π΅Ρ‚Π΅ Ρ‚ΠΎΡ‡Π½ΡƒΡŽ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Ρƒ, ΠΏΠΎ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π²Ρ‹Π²ΠΎΠ΄ получился ΠΈΠΌΠ΅Π½Π½ΠΎ Ρ‚Π°ΠΊΠΈΠΌ. - Если ΠΎΡ‚Π²Π΅Ρ‚ ΠΎΡ‚Ρ€ΠΈΡ†Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ (Ρ‡Ρ‚ΠΎ ΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½Π½ΠΎ Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎ), ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π³Π»ΡƒΠ±ΠΎΠΊΠΈΠΉ Π²Π΄ΠΎΡ… ΠΈ ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ объяснСниС (Π° Ссли ΠΏΡ€ΠΈΠΌΠ΅Ρ€ всС Π΅Ρ‰Π΅ нСпонятСн, ΠΈ создайтС issue [здСсь](https://github.com/satwikkansal/wtfpython/issues/new)). - Если "Π΄Π°", ΠΎΡ‰ΡƒΡ‚ΠΈΡ‚Π΅ ΠΌΠΎΡ‰ΡŒ своих ΠΏΠΎΠ·Π½Π°Π½ΠΈΠΉ Π² Python ΠΈ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΡ‚Π΅ ΠΊ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌΡƒ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρƒ. PS: Π’Ρ‹ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Ρ‡ΠΈΡ‚Π°Ρ‚ΡŒ WTFPython Π² ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строкС, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ [pypi package](https://pypi.python.org/pypi/wtfpython), ```sh pip install wtfpython -U wtfpython ``` # πŸ‘€ ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ ## БСкция: Напряги ΠΌΠΎΠ·Π³ΠΈ! ### β–Ά ΠŸΠ΅Ρ€Π²Ρ‹ΠΌ Π΄Π΅Π»ΠΎΠΌ! По ΠΊΠ°ΠΊΠΎΠΉ-Ρ‚ΠΎ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π΅ "ΠΌΠΎΡ€ΠΆΠΎΠ²Ρ‹ΠΉ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€" (Π°Π½Π³Π». walrus) `:=` Π² Python 3.8 стал довольно популярным. Π”Π°Π²Π°ΠΉΡ‚Π΅ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΠΌ Π΅Π³ΠΎ, 1\. ```py # Python version 3.8+ >>> a = "wtf_walrus" >>> a 'wtf_walrus' >>> a := "wtf_walrus" File "", line 1 a := "wtf_walrus" ^ SyntaxError: invalid syntax >>> (a := "wtf_walrus") # А этот ΠΊΠΎΠ΄ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ 'wtf_walrus' >>> a 'wtf_walrus' ``` 2 \. ```py # Python version 3.8+ >>> a = 6, 9 >>> a (6, 9) >>> (a := 6, 9) (6, 9) >>> a 6 >>> a, b = 6, 9 # Випичная распаковка >>> a, b (6, 9) >>> (a, b = 16, 19) # Упс File "", line 1 (a, b = 16, 19) ^ SyntaxError: invalid syntax >>> (a, b := 16, 19) # На Π²Ρ‹Π²ΠΎΠ΄Π΅ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ странный ΠΊΠΎΡ€Ρ‚Π΅ΠΆ ΠΈΠ· 3 элСмСнтов (6, 16, 19) >>> a # Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ остаСтся Π½Π΅ΠΈΠ·ΠΌΠ΅Π½Π½ΠΎΠΉ? 6 >>> b 16 ``` #### πŸ’‘ ОбьяснСниС **Быстрый Ρ€Π°Π·Π±ΠΎΡ€ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ "ΠΌΠΎΡ€ΠΆΠΎΠ²Ρ‹ΠΉ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€"** "ΠœΠΎΡ€ΠΆΠΎΠ²Ρ‹ΠΉ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€" (`:=`) Π±Ρ‹Π» прСдставлСн Π² Python 3.8, ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΠΎΠ»Π΅Π·Π΅Π½ Π² ситуациях, ΠΊΠΎΠ³Π΄Π° Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΏΡ€ΠΈΡΠ²ΠΎΠΈΡ‚ΡŒ значСния ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌ Π² Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΈ. ```py def some_func(): # ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Ρ‡Ρ‚ΠΎ здСсь Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΊ рСсурсам вычислСния # time.sleep(1000) return 5 # ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ вмСсто, if some_func(): print(some_func()) # ΠŸΠ»ΠΎΡ…Π°Ρ ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ°, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ вычислСния происходят Π΄Π²Π°ΠΆΠ΄Ρ‹. # Или a = some_func() if a: print(a) # МоТно Π»Π°ΠΊΠΎΠ½ΠΈΡ‡Π½ΠΎ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ if a := some_func(): print(a) ``` **Π’Ρ‹Π²ΠΎΠ΄ (> 3.8):** ```py 5 5 5 ``` ИспользованиС `:=` сэкономило ΠΎΠ΄Π½Ρƒ строку ΠΊΠΎΠ΄Π° ΠΈ нСявно ΠΏΡ€Π΅Π΄ΠΎΡ‚Π²Ρ€Π°Ρ‚ΠΈΠ»ΠΎ Π²Ρ‹Π·ΠΎΠ² `some_func` Π΄Π²Π°ΠΆΠ΄Ρ‹. - "Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ присваивания", Π½Π΅ ΠΎΠ±Π΅Ρ€Π½ΡƒΡ‚ΠΎΠ΅ Π² скобки, ΠΈΠ½Π°Ρ‡Π΅ говоря использованиС ΠΌΠΎΡ€ΠΆΠΎΠ²ΠΎΠ³ΠΎ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π°, ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΎ Π½Π° Π²Π΅Ρ€Ρ…Π½Π΅ΠΌ ΡƒΡ€ΠΎΠ²Π½Π΅, ΠΎΡ‚ΡΡŽΠ΄Π° `SyntaxError` Π² Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΈ `a := "wtf_walrus"` Π² ΠΏΠ΅Ρ€Π²ΠΎΠΌ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚Π΅. ПослС оборачивания Π² скобки, `a` Π±Ρ‹Π»ΠΎ присвоСно Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, ΠΊΠ°ΠΊ ΠΈ оТидалось. - Π’ Ρ‚ΠΎ ΠΆΠ΅ врСмя ΠΎΠ±ΠΎΡ€Π°Ρ‡ΠΈΠ²Π°Π½ΠΈΠ΅ скобками выраТСния, содСрТащСго ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ `=`, Π½Π΅ допускаСтся. ΠžΡ‚ΡΡŽΠ΄Π° синтаксичСская ошибка Π² `(a, b = 6, 9)`. - Бинтаксис ΠΌΠΎΡ€ΠΆΠΎΠ²ΠΎΠ³ΠΎ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° ΠΈΠΌΠ΅Π΅Ρ‚ Π²ΠΈΠ΄ `NAME:= expr`, Π³Π΄Π΅ `NAME` - допустимый ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€, Π° `expr` - допустимоС Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅. Π‘Π»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, ΡƒΠΏΠ°ΠΊΠΎΠ²ΠΊΠ° ΠΈ распаковка ΠΈΡ‚Π΅Ρ€ΠΈΡ€ΡƒΠ΅ΠΌΡ‹Ρ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Π½Π΅ поддСрТиваСтся, Ρ‡Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, - `(a := 6, 9)` эквивалСнтно `((a := 6), 9)` ΠΈ Π² ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΠΌ ΠΈΡ‚ΠΎΠ³Π΅ `(a, 9)` (Π³Π΄Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ `a` Ρ€Π°Π²Π½ΠΎ `6`) ```py >>> (a := 6, 9) == ((a := 6), 9) True >>> x = (a := 696, 9) >>> x (696, 9) >>> x[0] is a # Оба ΡΡΡ‹Π»Π°ΡŽΡ‚ΡΡ Π½Π° ΠΎΠ΄Π½Ρƒ ΠΈ Ρ‚Ρƒ ΠΆΠ΅ ячСйку памяти True ``` - Аналогично, `(a, b := 16, 19)` эквивалСнтно `(a, (b := 16), 19)`, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π΅ΡΡ‚ΡŒ Π½Π΅ Ρ‡Ρ‚ΠΎ ΠΈΠ½ΠΎΠ΅, ΠΊΠ°ΠΊ ΠΊΠΎΡ€Ρ‚Π΅ΠΆ ΠΈΠ· 3 элСмСнтов. --- ### β–Ά Π‘Ρ‚Ρ€ΠΎΠΊΠΈ ΠΈΠ½ΠΎΠ³Π΄Π° Π²Π΅Π΄ΡƒΡ‚ сСбя нСпрСдсказуСмо 1\. ```py >>> a = "some_string" >>> id(a) 140420665652016 >>> id("some" + "_" + "string") # ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, ΠΎΠ±Π° ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π° ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹ 140420665652016 ``` 2\. ```py >>> a = "wtf" >>> b = "wtf" >>> a is b True >>> a = "wtf!" >>> b = "wtf!" >>> a is b False ``` 3\. ```py >>> a, b = "wtf!", "wtf!" >>> a is b # ΠΠΊΡ‚ΡƒΠ°Π»ΡŒΠ½ΠΎ для вСрсий Python, ΠΊΡ€ΠΎΠΌΠ΅ 3.7.x True >>> a = "wtf!"; b = "wtf!" >>> a is b # Π’Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Π²Π΅Ρ€Π½Π΅Ρ‚ True ΠΈΠ»ΠΈ False Π² зависимости Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌΠΎΠΉ срСды (python shell / ipython / скрипт). False ``` ```py # На этот Ρ€Π°Π· Π² Ρ„Π°ΠΉΠ»Π΅ a = "wtf!" b = "wtf!" print(a is b) # Π’Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ True ΠΏΡ€ΠΈ запускС модуля ``` 4\. **Output (< Python3.7 )** ```py >>> 'a' * 20 is 'aaaaaaaaaaaaaaaaaaaa' True >>> 'a' * 21 is 'aaaaaaaaaaaaaaaaaaaaa' False ``` Π›ΠΎΠ³ΠΈΡ‡Π½ΠΎ, ΠΏΡ€Π°Π²Π΄Π°? #### πŸ’‘ ОбъяснСниС - ПовСдСниС Π² ΠΏΠ΅Ρ€Π²ΠΎΠΌ ΠΈ Π²Ρ‚ΠΎΡ€ΠΎΠΌ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚Π°Ρ… связано с ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ CPython (Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΠΎΠΉ ΠΈΠ½Ρ‚Π΅Ρ€Π½ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ строк ((Π°Π½Π³Π». string interning))), которая пытаСтся ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ нСизмСняСмыС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Π² Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… случаях вмСсто Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π· ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ Π½ΠΎΠ²Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚. - ПослС "интСрнирования" ΠΌΠ½ΠΎΠ³ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΡΡΡ‹Π»Π°Ρ‚ΡŒΡΡ Π½Π° ΠΎΠ΄ΠΈΠ½ ΠΈ Ρ‚ΠΎΡ‚ ΠΆΠ΅ строковый ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π² памяти (Ρ‚Π΅ΠΌ самым экономя ΠΏΠ°ΠΌΡΡ‚ΡŒ). - Π’ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹Ρ… Π²Ρ‹ΡˆΠ΅ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚Π°Ρ… строки нСявно ΠΈΠ½Ρ‚Π΅Ρ€Π½ΠΈΡ€ΠΎΠ²Π°Π½Ρ‹. РСшСниС ΠΎ Ρ‚ΠΎΠΌ, ΠΊΠΎΠ³Π΄Π° нСявно ΠΈΠ½Ρ‚Π΅Ρ€Π½ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ строку, зависит ΠΎΡ‚ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ. ΠŸΡ€Π°Π²ΠΈΠ»Π° для интСрнирования строк ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅: - ВсС строки Π΄Π»ΠΈΠ½ΠΎΠΉ 0 ΠΈΠ»ΠΈ 1 символа ΠΈΠ½Ρ‚Π΅Ρ€Π½ΠΈΡ€ΡƒΡŽΡ‚ΡΡ. - Π‘Ρ‚Ρ€ΠΎΠΊΠΈ ΠΈΠ½Ρ‚Π΅Ρ€Π½ΠΈΡ€ΡƒΡŽΡ‚ΡΡ Π²ΠΎ врСмя компиляции (`'wtf'` Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠ½Ρ‚Π΅Ρ€Π½ΠΈΡ€ΠΎΠ²Π°Π½Π°, Π½ΠΎ `''.join(['w'', 't', 'f'])` - Π½Π΅Ρ‚) - Π‘Ρ‚Ρ€ΠΎΠΊΠΈ, Π½Π΅ состоящиС ΠΈΠ· Π±ΡƒΠΊΠ² ASCII, Ρ†ΠΈΡ„Ρ€ ΠΈΠ»ΠΈ Π·Π½Π°ΠΊΠΎΠ² подчСркивания, Π½Π΅ ΠΈΠ½Ρ‚Π΅Ρ€Π½ΠΈΡ€ΡƒΡŽΡ‚ΡΡ. Π’ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Π²Ρ‹ΡˆΠ΅ `'wtf!'` Π½Π΅ интСрнируСтся ΠΈΠ·-Π·Π° `!`. Π Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ этого ΠΏΡ€Π°Π²ΠΈΠ»Π° Π² CPython ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡ‚ΠΈ [здСсь](https://github.com/python/cpython/blob/3.6/Objects/codeobject.c#L19) ![image](/images/string-intern/string_intern.png) - Когда ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ `a` ΠΈ `b` ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ `"wtf!"` Π² ΠΎΠ΄Π½ΠΎΠΉ строкС, ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€ Python создаСт Π½ΠΎΠ²Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, Π° Π·Π°Ρ‚Π΅ΠΌ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ ссылаСтся Π½Π° Π²Ρ‚ΠΎΡ€ΡƒΡŽ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ. Если это выполняСтся Π² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Ρ… строках, ΠΎΠ½ Π½Π΅ "Π·Π½Π°Π΅Ρ‚", Ρ‡Ρ‚ΠΎ ΡƒΠΆΠ΅ сущСствуСт `"wtf!"` ΠΊΠ°ΠΊ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ (ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ `"wtf!"` Π½Π΅ являСтся нСявно ΠΈΠ½Ρ‚Π΅Ρ€Π½ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΌ Π² соотвСтствии с Ρ„Π°ΠΊΡ‚Π°ΠΌΠΈ, упомянутыми Π²Ρ‹ΡˆΠ΅). Π­Ρ‚ΠΎ оптимизация Π²ΠΎ врСмя компиляции, Π½Π΅ примСняСтся ΠΊ вСрсиям CPython 3.7.x (Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎΠ΅ обсуТдСниС смотритС здСсь [issue](https://github.com/satwikkansal/wtfpython/issues/100)). - Π•Π΄ΠΈΠ½ΠΈΡ†Π° компиляции Π² ΠΈΠ½Ρ‚Π΅Ρ€Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΠΉ срСдС IPython состоит ΠΈΠ· ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π°, Ρ‚ΠΎΠ³Π΄Π° ΠΊΠ°ΠΊ Π² случаС ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ ΠΎΠ½Π° состоит ΠΈΠ· всСго модуля. `a, b = "wtf!", "wtf!"` - это ΠΎΠ΄Π½ΠΎ ΡƒΡ‚Π²Π΅Ρ€ΠΆΠ΄Π΅Π½ΠΈΠ΅, Ρ‚ΠΎΠ³Π΄Π° ΠΊΠ°ΠΊ `a = "wtf!"; b = "wtf!"` - это Π΄Π²Π° утвСрТдСния Π² ΠΎΠ΄Π½ΠΎΠΉ строкС. Π­Ρ‚ΠΎ ΠΎΠ±ΡŠΡΡΠ½ΡΠ΅Ρ‚, ΠΏΠΎΡ‡Π΅ΠΌΡƒ тоТдСства Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ Π² `a = "wtf!"; b = "wtf!"`, Π½ΠΎ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹ ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ Π² ΠΌΠΎΠ΄ΡƒΠ»Π΅. - Π Π΅Π·ΠΊΠΎΠ΅ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Π² Π²Ρ‹Π²ΠΎΠ΄Π΅ Ρ‡Π΅Ρ‚Π²Π΅Ρ€Ρ‚ΠΎΠ³ΠΎ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚Π° связано с [peephole optimization](https://en.wikipedia.org/wiki/Peephole_optimization) Ρ‚Π΅Ρ…Π½ΠΈΠΊΠΎΠΉ, извСстной ΠΊΠ°ΠΊ складываниС констант (Π°Π½Π³Π». Constant folding). Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ `'a'*20` замСняСтся Π½Π° `'aaaaaaaaaaaaaaaaaaaa'` Π²ΠΎ врСмя компиляции, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΡΠΊΠΎΠ½ΠΎΠΌΠΈΡ‚ΡŒ нСсколько Ρ‚Π°ΠΊΡ‚ΠΎΠ² Π²ΠΎ врСмя выполнСния. Π‘ΠΊΠ»Π°Π΄Ρ‹Π²Π°Π½ΠΈΠ΅ констант происходит Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для строк Π΄Π»ΠΈΠ½ΠΎΠΉ ΠΌΠ΅Π½Π΅Π΅ 21. (ΠŸΠΎΡ‡Π΅ΠΌΡƒ? ΠŸΡ€Π΅Π΄ΡΡ‚Π°Π²ΡŒΡ‚Π΅ сСбС Ρ€Π°Π·ΠΌΠ΅Ρ€ Ρ„Π°ΠΉΠ»Π° `.pyc`, созданного Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ выполнСния выраТСния `'a'*10**10`). [Π’ΠΎΡ‚](https://github.com/python/cpython/blob/3.6/Python/peephole.c#L288) исходный тСкст Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ для этого. - ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅: Π’ Python 3.7 складываниС констант Π±Ρ‹Π»ΠΎ пСрСнСсСно ΠΈΠ· ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ‚ΠΎΡ€Π° peephole Π² Π½ΠΎΠ²Ρ‹ΠΉ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ‚ΠΎΡ€ AST с Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ измСнСниями Π² Π»ΠΎΠ³ΠΈΠΊΠ΅, поэтому Ρ‡Π΅Ρ‚Π²Π΅Ρ€Ρ‚Ρ‹ΠΉ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ Π½Π΅ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π² Python 3.7. ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅ ΠΎΠ± ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ [здСсь](https://bugs.python.org/issue11549). --- ### β–Ά ΠžΡΡ‚ΠΎΡ€ΠΎΠΆΠ½Π΅Π΅ с Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠΎΠΉ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ ```py >>> (False == False) in [False] # Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎ False >>> False == (False in [False]) # всС Π΅Ρ‰Π΅ Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎ False >>> False == False in [False] # Π° Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Ρ‡Ρ‚ΠΎ? True >>> True is False == False False >>> False is False is False True >>> 1 > 0 < 1 True >>> (1 > 0) < 1 False >>> 1 > (0 < 1) False ``` #### πŸ’‘ ОбъяснСниС: Богласно https://docs.python.org/3/reference/expressions.html#comparisons > Π€ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎ, Ссли a, b, c, ..., y, z - выраТСния, Π° op1, op2, ..., opN - ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ сравнСния, Ρ‚ΠΎ a op1 b op2 c ... y opN z эквивалСнтно a op1 b ΠΈ b op2 c ΠΈ ... y opN z, Π·Π° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ ΠΊΠ°ΠΆΠ΄ΠΎΠ΅ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ оцСниваСтся Π½Π΅ Π±ΠΎΠ»Π΅Π΅ ΠΎΠ΄Π½ΠΎΠ³ΠΎ Ρ€Π°Π·Π°. Π₯отя Ρ‚Π°ΠΊΠΎΠ΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ Π³Π»ΡƒΠΏΡ‹ΠΌ Π² ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹Ρ… Π²Ρ‹ΡˆΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°Ρ…, ΠΎΠ½ΠΎ просто фантастично для Ρ‚Π°ΠΊΠΈΡ… Π²Π΅Ρ‰Π΅ΠΉ, ΠΊΠ°ΠΊ `a == b == c` ΠΈ `0 <= x <= 100`. * `False is False is False` эквивалСнтно `(False is False) ΠΈ (False is False)`. * `True is False == False` эквивалСнтно `(True is False) and (False == False)` ΠΈ Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ пСрвая Ρ‡Π°ΡΡ‚ΡŒ высказывания (`True is False`) оцСниваСтся Π² `False`, Ρ‚ΠΎ всС Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ приводится ΠΊ `False`. * `1 > 0 < 1` эквивалСнтно `(1 > 0) ΠΈ (0 < 1)`, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ приводится ΠΊ `True`. * Π’Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ `(1 > 0) < 1` эквивалСнтно `True < 1` ΠΈ ```py >>> int(True) 1 >>> True + 1 # Π½Π΅ относится ΠΊ Π΄Π°Π½Π½ΠΎΠΌΡƒ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρƒ, Π½ΠΎ просто для интСрСса 2 ``` Π’ ΠΈΡ‚ΠΎΠ³Π΅, `1 < 1` выполняСтся ΠΈ Π΄Π°Π΅Ρ‚ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ `False` --- ### β–Ά Как Π½Π΅ Π½Π°Π΄ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ `is` НиТС ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ ΠΎΡ‡Π΅Π½ΡŒ извСстный ΠΏΡ€ΠΈΠΌΠ΅Ρ€. 1\. ```py >>> a = 256 >>> b = 256 >>> a is b True >>> a = 257 >>> b = 257 >>> a is b False ``` 2\. ```py >>> a = [] >>> b = [] >>> a is b False >>> a = tuple() >>> b = tuple() >>> a is b True ``` 3\. **Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚** ```py >>> a, b = 257, 257 >>> a is b True ``` **Π’Ρ‹Π²ΠΎΠ΄ (Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для Python 3.7.x)** ```py >>> a, b = 257, 257 >>> a is b False ``` #### πŸ’‘ ОбъяснСниС: **Π Π°Π·Π½ΠΈΡ†Π° ΠΌΠ΅ΠΆΠ΄Ρƒ `is` ΠΈ `==`**. * ΠžΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ `is` провСряСт, ΡΡΡ‹Π»Π°ΡŽΡ‚ΡΡ Π»ΠΈ ΠΎΠ±Π° ΠΎΠΏΠ΅Ρ€Π°Π½Π΄Π° Π½Π° ΠΎΠ΄ΠΈΠ½ ΠΈ Ρ‚ΠΎΡ‚ ΠΆΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ (Ρ‚.Π΅. провСряСт, ΡΠΎΠ²ΠΏΠ°Π΄Π°ΡŽΡ‚ Π»ΠΈ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Ρ‹ ΠΎΠΏΠ΅Ρ€Π°Π½Π΄ΠΎΠ² ΠΈΠ»ΠΈ Π½Π΅Ρ‚). * ΠžΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ `==` сравниваСт значСния ΠΎΠ±ΠΎΠΈΡ… ΠΎΠΏΠ΅Ρ€Π°Π½Π΄ΠΎΠ² ΠΈ провСряСт, ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹ Π»ΠΈ ΠΎΠ½ΠΈ. * Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ `is` ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½ для равСнства ссылок, Π° `==` - для равСнства Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ. ΠŸΡ€ΠΈΠΌΠ΅Ρ€, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΎΡΡΠ½ΠΈΡ‚ΡŒ ΡΠΈΡ‚ΡƒΠ°Ρ†ΠΈΡŽ, ```py >>> class A: pass >>> A() is A() # 2 пустых ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Π² Ρ€Π°Π·Π½Ρ‹Ρ… ячСйках памяти False ``` **`256` - ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, Π° `257` - Π½Π΅Ρ‚**. ΠŸΡ€ΠΈ запускС python числа ΠΎΡ‚ `-5` Π΄ΠΎ `256` Π·Π°ΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‚ΡΡ Π² ΠΏΠ°ΠΌΡΡ‚ΡŒ. Π­Ρ‚ΠΈ числа ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ часто, поэтому ΠΈΠΌΠ΅Π΅Ρ‚ смысл просто ΠΈΠΌΠ΅Ρ‚ΡŒ ΠΈΡ… Π½Π°Π³ΠΎΡ‚ΠΎΠ²Π΅. ΠŸΠ΅Ρ€Π΅Π²ΠΎΠ΄ Ρ†ΠΈΡ‚Π°Ρ‚Ρ‹ ΠΈΠ· [Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ](https://docs.python.org/3/c-api/long.html) > ВСкущая рСализация Ρ…Ρ€Π°Π½ΠΈΡ‚ массив цСлочислСнных ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² для всСх Ρ†Π΅Π»Ρ‹Ρ… чисСл ΠΎΡ‚ -5 Π΄ΠΎ 256, ΠΊΠΎΠ³Π΄Π° Π²Ρ‹ создаСтС int Π² этом Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π΅, Π²Ρ‹ просто ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚Π΅ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ ссылку Π½Π° ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚. ```py >>> id(256) 10922528 >>> a = 256 >>> b = 256 >>> id(a) 10922528 >>> id(b) 10922528 >>> id(257) 140084850247312 >>> x = 257 >>> y = 257 >>> id(x) 140084850247440 >>> id(y) 140084850247344 ``` Π˜Π½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€ Π½Π΅ ΠΏΠΎΠ½ΠΈΠΌΠ°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Π΄ΠΎ выполнСния выраТСния `y = 257` Ρ†Π΅Π»ΠΎΠ΅ число со Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ `257` ΡƒΠΆΠ΅ создано, ΠΈ поэтому ΠΎΠ½ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°Π΅Ρ‚ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π² памяти. Подобная оптимизация ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΠΌΠ° ΠΈ ΠΊ Π΄Ρ€ΡƒΠ³ΠΈΠΌ **измСняСмым** ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌ, Ρ‚Π°ΠΊΠΈΠΌ ΠΊΠ°ΠΊ пустыС ΠΊΠΎΡ€Ρ‚Π΅ΠΆΠΈ. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ списки ΡΠ²Π»ΡΡŽΡ‚ΡΡ измСняСмыми, поэтому `[] is []` Π²Π΅Ρ€Π½Π΅Ρ‚ `False`, Π° `() is ()` Π²Π΅Ρ€Π½Π΅Ρ‚ `True`. Π­Ρ‚ΠΎ ΠΎΠ±ΡŠΡΡΠ½ΡΠ΅Ρ‚ наш Π²Ρ‚ΠΎΡ€ΠΎΠΉ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚. ΠŸΠ΅Ρ€Π΅ΠΉΠ΄Π΅ΠΌ ΠΊ Ρ‚Ρ€Π΅Ρ‚ΡŒΠ΅ΠΌΡƒ, **И `a`, ΠΈ `b` ΡΡΡ‹Π»Π°ΡŽΡ‚ΡΡ Π½Π° ΠΎΠ΄ΠΈΠ½ ΠΈ Ρ‚ΠΎΡ‚ ΠΆΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΏΡ€ΠΈ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΎΠ΄Π½ΠΈΠΌ ΠΈ Ρ‚Π΅ΠΌ ΠΆΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ Π² ΠΎΠ΄Π½ΠΎΠΉ ΠΈ Ρ‚ΠΎΠΉ ΠΆΠ΅ строкСi**. **Π’Ρ‹Π²ΠΎΠ΄** ```py >>> a, b = 257, 257 >>> id(a) 140640774013296 >>> id(b) 140640774013296 >>> a = 257 >>> b = 257 >>> id(a) 140640774013392 >>> id(b) 140640774013488 ``` * Когда a ΠΈ b ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‚ΡΡ со Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ `257` Π² ΠΎΠ΄Π½ΠΎΠΉ строкС, ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€ Python создаСт Π½ΠΎΠ²Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, Π° Π·Π°Ρ‚Π΅ΠΌ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ ссылаСтся Π½Π° Π½Π΅Π³ΠΎ Π²ΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠΉ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ. Если Π΄Π΅Π»Π°Ρ‚ΡŒ это Π² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Ρ… строках, ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€ Π½Π΅ "Π·Π½Π°Π΅Ρ‚", Ρ‡Ρ‚ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ `257` ΡƒΠΆΠ΅ сущСствуСт. * Π­Ρ‚ΠΎ оптимизация компилятора ΠΈ относится ΠΈΠΌΠ΅Π½Π½ΠΎ ΠΊ ΠΈΠ½Ρ‚Π΅Ρ€Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΠΉ срСдС. Когда Π²Ρ‹ Π²Π²ΠΎΠ΄ΠΈΡ‚Π΅ Π΄Π²Π΅ строки Π² ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€Π΅, ΠΎΠ½ΠΈ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΡŽΡ‚ΡΡ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎ, поэтому ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‚ΡΡ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎ. Если Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ этот ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π² Ρ„Π°ΠΉΠ»Π΅ `.py', ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΡ‚Π»ΠΈΡ‡Π°Ρ‚ΡŒΡΡ, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Ρ„Π°ΠΉΠ» компилируСтся вСсь сразу. Π­Ρ‚Π° оптимизация Π½Π΅ ограничиваСтся Ρ†Π΅Π»Ρ‹ΠΌΠΈ числами, ΠΎΠ½Π° Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΈ для Π΄Ρ€ΡƒΠ³ΠΈΡ… нСизмСняСмых Ρ‚ΠΈΠΏΠΎΠ² Π΄Π°Π½Π½Ρ‹Ρ…, Ρ‚Π°ΠΊΠΈΡ… ΠΊΠ°ΠΊ строки (ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ "Π‘Ρ‚Ρ€ΠΎΠΊΠΈ - это слоТно") ΠΈ ΠΏΠ»Π°Π²Π°ΡŽΡ‰ΠΈΠ΅ числа, ```py >>> a, b = 257.0, 257.0 >>> a is b True ``` * ΠŸΠΎΡ‡Π΅ΠΌΡƒ это Π½Π΅ сработало Π² Python 3.7? Абстрактная ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π° Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΈΠ΅ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ компилятора зависят ΠΎΡ‚ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ (Ρ‚.Π΅. ΠΌΠΎΠ³ΡƒΡ‚ ΠΌΠ΅Π½ΡΡ‚ΡŒΡΡ Π² зависимости ΠΎΡ‚ вСрсии, ОБ ΠΈ Ρ‚.Π΄.). Π― всС Π΅Ρ‰Π΅ Π²Ρ‹ΡΡΠ½ΡΡŽ, ΠΊΠ°ΠΊΠΎΠ΅ ΠΈΠΌΠ΅Π½Π½ΠΎ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π²Ρ‹Π·Π²Π°Π»ΠΎ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ этот [issue](https://github.com/satwikkansal/wtfpython/issues/100) для получСния ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠΉ. ---