diff --git a/.gitignore b/.gitignore index 057dcb0..998895f 100644 --- a/.gitignore +++ b/.gitignore @@ -16,3 +16,8 @@ irrelevant/.ipynb_checkpoints/ irrelevant/.python-version .idea/ +.vscode/ + +# Virtual envitonments +venv/ +.venv/ diff --git a/README.md b/README.md index 17851d0..2c6b043 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,10 @@ -
++ +
Exploring and understanding Python through surprising snippets.
@@ -352,7 +358,14 @@ Makes sense, right? * All length 0 and length 1 strings are interned. * Strings are interned at compile time (`'wtf'` will be interned but `''.join(['w', 't', 'f'])` will not be interned) * Strings that are not composed of ASCII letters, digits or underscores, are not interned. This explains why `'wtf!'` was not interned due to `!`. CPython implementation of this rule can be found [here](https://github.com/python/cpython/blob/3.6/Objects/codeobject.c#L19) - ![image](/images/string-intern/string_intern.png) ++ +
+ + When `a` and `b` are set to `"wtf!"` in the same line, the Python interpreter creates a new object, then references the second variable at the same time. If you do it on separate lines, it doesn't "know" that there's already `"wtf!"` as an object (because `"wtf!"` is not implicitly interned as per the facts mentioned above). It's a compile-time optimization. This optimization doesn't apply to 3.7.x versions of CPython (check this [issue](https://github.com/satwikkansal/wtfpython/issues/100) for more discussion). + A compile unit in an interactive environment like IPython consists of a single statement, whereas it consists of the entire module in case of modules. `a, b = "wtf!", "wtf!"` is single statement, whereas `a = "wtf!"; b = "wtf!"` are two statements in a single line. This explains why the identities are different in `a = "wtf!"; b = "wtf!"`, and also explain why they are same when invoked in `some_file.py` + The abrupt change in the output of the fourth snippet is due to a [peephole optimization](https://en.wikipedia.org/wiki/Peephole_optimization) technique known as Constant folding. This means the expression `'a'*20` is replaced by `'aaaaaaaaaaaaaaaaaaaa'` during compilation to save a few clock cycles during runtime. Constant folding only occurs for strings having a length of less than 21. (Why? Imagine the size of `.pyc` file generated as a result of the expression `'a'*10**10`). [Here's](https://github.com/python/cpython/blob/3.6/Python/peephole.c#L288) the implementation source for the same. @@ -975,11 +988,23 @@ We didn't assign three `"X"`s, did we? When we initialize `row` variable, this visualization explains what happens in the memory -![image](/images/tic-tac-toe/after_row_initialized.png) ++ +
And when the `board` is initialized by multiplying the `row`, this is what happens inside the memory (each of the elements `board[0]`, `board[1]` and `board[2]` is a reference to the same list referred by `row`) -![image](/images/tic-tac-toe/after_board_initialized.png) ++ +
We can avoid this scenario here by not using `row` variable to generate `board`. (Asked in [this](https://github.com/satwikkansal/wtfpython/issues/68) issue). diff --git a/images/expanding-brain-meme.jpg b/images/expanding-brain-meme.jpg deleted file mode 100644 index 9437c2f..0000000 Binary files a/images/expanding-brain-meme.jpg and /dev/null differ diff --git a/images/logo-dark.png b/images/logo-dark.png deleted file mode 100644 index 9d7791f..0000000 Binary files a/images/logo-dark.png and /dev/null differ diff --git a/images/logo.png b/images/logo.png deleted file mode 100644 index 014a63a..0000000 Binary files a/images/logo.png and /dev/null differ diff --git a/images/logo.svg b/images/logo.svg new file mode 100755 index 0000000..6ec5eda --- /dev/null +++ b/images/logo.svg @@ -0,0 +1,38 @@ + + + diff --git a/images/logo_dark_theme.svg b/images/logo_dark_theme.svg new file mode 100755 index 0000000..f89e797 --- /dev/null +++ b/images/logo_dark_theme.svg @@ -0,0 +1,38 @@ + + + diff --git a/images/string-intern/string_intern.png b/images/string-intern/string_intern.png deleted file mode 100644 index 6511978..0000000 Binary files a/images/string-intern/string_intern.png and /dev/null differ diff --git a/images/string-intern/string_interning.svg b/images/string-intern/string_interning.svg new file mode 100755 index 0000000..0572a9e --- /dev/null +++ b/images/string-intern/string_interning.svg @@ -0,0 +1,4 @@ + + + + diff --git a/images/string-intern/string_interning_dark_theme.svg b/images/string-intern/string_interning_dark_theme.svg new file mode 100755 index 0000000..69c32e4 --- /dev/null +++ b/images/string-intern/string_interning_dark_theme.svg @@ -0,0 +1,4 @@ + + + + diff --git a/images/tic-tac-toe.png b/images/tic-tac-toe.png deleted file mode 100644 index 9c25117..0000000 Binary files a/images/tic-tac-toe.png and /dev/null differ diff --git a/images/tic-tac-toe/after_board_initialized.png b/images/tic-tac-toe/after_board_initialized.png deleted file mode 100644 index 616747f..0000000 Binary files a/images/tic-tac-toe/after_board_initialized.png and /dev/null differ diff --git a/images/tic-tac-toe/after_board_initialized.svg b/images/tic-tac-toe/after_board_initialized.svg new file mode 100755 index 0000000..02b1dad --- /dev/null +++ b/images/tic-tac-toe/after_board_initialized.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/images/tic-tac-toe/after_board_initialized_dark_theme.svg b/images/tic-tac-toe/after_board_initialized_dark_theme.svg new file mode 100755 index 0000000..3218ad0 --- /dev/null +++ b/images/tic-tac-toe/after_board_initialized_dark_theme.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/images/tic-tac-toe/after_row_initialized.png b/images/tic-tac-toe/after_row_initialized.png deleted file mode 100644 index 520d700..0000000 Binary files a/images/tic-tac-toe/after_row_initialized.png and /dev/null differ diff --git a/images/tic-tac-toe/after_row_initialized.svg b/images/tic-tac-toe/after_row_initialized.svg new file mode 100755 index 0000000..92eb02c --- /dev/null +++ b/images/tic-tac-toe/after_row_initialized.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/images/tic-tac-toe/after_row_initialized_dark_theme.svg b/images/tic-tac-toe/after_row_initialized_dark_theme.svg new file mode 100755 index 0000000..2404958 --- /dev/null +++ b/images/tic-tac-toe/after_row_initialized_dark_theme.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/irrelevant/wtf.ipynb b/irrelevant/wtf.ipynb index a3147e1..4ea2333 100644 --- a/irrelevant/wtf.ipynb +++ b/irrelevant/wtf.ipynb @@ -4,7 +4,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "\n", + "\n", "Exploring and understanding Python through surprising snippets.
\n", "\n", @@ -355,7 +355,7 @@ " * All length 0 and length 1 strings are interned.\n", " * Strings are interned at compile time (`'wtf'` will be interned but `''.join(['w', 't', 'f'])` will not be interned)\n", " * Strings that are not composed of ASCII letters, digits or underscores, are not interned. This explains why `'wtf!'` was not interned due to `!`. CPython implementation of this rule can be found [here](https://github.com/python/cpython/blob/3.6/Objects/codeobject.c#L19)\n", - " ![image](/images/string-intern/string_intern.png)\n", + "\n", "+ When `a` and `b` are set to `\"wtf!\"` in the same line, the Python interpreter creates a new object, then references the second variable at the same time. If you do it on separate lines, it doesn't \"know\" that there's already `\"wtf!\"` as an object (because `\"wtf!\"` is not implicitly interned as per the facts mentioned above). It's a compile-time optimization. This optimization doesn't apply to 3.7.x versions of CPython (check this [issue](https://github.com/satwikkansal/wtfpython/issues/100) for more discussion).\n", "+ A compile unit in an interactive environment like IPython consists of a single statement, whereas it consists of the entire module in case of modules. `a, b = \"wtf!\", \"wtf!\"` is single statement, whereas `a = \"wtf!\"; b = \"wtf!\"` are two statements in a single line. This explains why the identities are different in `a = \"wtf!\"; b = \"wtf!\"`, and also explain why they are same when invoked in `some_file.py`\n", "+ The abrupt change in the output of the fourth snippet is due to a [peephole optimization](https://en.wikipedia.org/wiki/Peephole_optimization) technique known as Constant folding. This means the expression `'a'*20` is replaced by `'aaaaaaaaaaaaaaaaaaaa'` during compilation to save a few clock cycles during runtime. Constant folding only occurs for strings having a length of less than 21. (Why? Imagine the size of `.pyc` file generated as a result of the expression `'a'*10**10`). [Here's](https://github.com/python/cpython/blob/3.6/Python/peephole.c#L288) the implementation source for the same.\n", @@ -2947,11 +2947,11 @@ "\n", "When we initialize `row` variable, this visualization explains what happens in the memory\n", "\n", - "![image](/images/tic-tac-toe/after_row_initialized.png)\n", + "\n", "\n", "And when the `board` is initialized by multiplying the `row`, this is what happens inside the memory (each of the elements `board[0]`, `board[1]` and `board[2]` is a reference to the same list referred by `row`)\n", "\n", - "![image](/images/tic-tac-toe/after_board_initialized.png)\n", + "\n", "\n", "We can avoid this scenario here by not using `row` variable to generate `board`. (Asked in [this](https://github.com/satwikkansal/wtfpython/issues/68) issue).\n", "\n" @@ -13475,4 +13475,4 @@ "metadata": {}, "nbformat": 4, "nbformat_minor": 2 -} \ No newline at end of file +} diff --git a/translations/ru-russian/README.md b/translations/ru-russian/README.md index d8dff4a..1936149 100644 --- a/translations/ru-russian/README.md +++ b/translations/ru-russian/README.md @@ -1,4 +1,10 @@ - ++ +
ΠΠ·ΡΡΠ΅Π½ΠΈΠ΅ ΠΈ ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΠ΅ Python Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΡΠ΄ΠΈΠ²ΠΈΡΠ΅Π»ΡΠ½ΡΡ ΠΏΡΠΈΠΌΠ΅ΡΠΎΠ² ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΡ.
@@ -408,7 +414,13 @@ False - ΠΡΠ΅ ΡΡΡΠΎΠΊΠΈ Π΄Π»ΠΈΠ½ΠΎΠΉ 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 (Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΠΎΠ΅ ΠΎΠ±ΡΡΠΆΠ΄Π΅Π½ΠΈΠ΅ ΡΠΌΠΎΡΡΠΈΡΠ΅ [Π·Π΄Π΅ΡΡ](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) ΠΈΡΡ ΠΎΠ΄Π½ΡΠΉ ΡΠ΅ΠΊΡΡ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ Π΄Π»Ρ ΡΡΠΎΠ³ΠΎ. @@ -1038,11 +1050,23 @@ board = [row] * 3 ΠΠΎΠ³Π΄Π° ΠΌΡ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΡΠ΅ΠΌ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ `row`, ΡΡΠ° Π²ΠΈΠ·ΡΠ°Π»ΠΈΠ·Π°ΡΠΈΡ ΠΎΠ±ΡΡΡΠ½ΡΠ΅Ρ, ΡΡΠΎ ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ Π² ΠΏΠ°ΠΌΡΡΠΈ -![image](/images/tic-tac-toe/after_row_initialized.png) ++ +
Π ΠΊΠΎΠ³Π΄Π° ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½Π°Ρ `board` ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΡΠ΅ΡΡΡ ΠΏΡΡΠ΅ΠΌ ΡΠΌΠ½ΠΎΠΆΠ΅Π½ΠΈΡ `row`, Π²ΠΎΡ ΡΡΠΎ ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ Π² ΠΏΠ°ΠΌΡΡΠΈ (ΠΊΠ°ΠΆΠ΄ΡΠΉ ΠΈΠ· ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ² `board[0]`, `board[1]` ΠΈ `board[2]` ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΡΡΠ»ΠΊΠΎΠΉ Π½Π° ΡΠΎΡ ΠΆΠ΅ ΡΠΏΠΈΡΠΎΠΊ, Π½Π° ΠΊΠΎΡΠΎΡΡΠΉ ΡΡΡΠ»Π°Π΅ΡΡΡ `row`) -![image](/images/tic-tac-toe/after_board_initialized.png) ++ +
ΠΡ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΠ·Π±Π΅ΠΆΠ°ΡΡ ΡΡΠΎΠ³ΠΎ ΡΡΠ΅Π½Π°ΡΠΈΡ, Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ `row` Π΄Π»Ρ Π³Π΅Π½Π΅ΡΠ°ΡΠΈΠΈ `board`. (ΠΠΎΠ΄ΡΠΎΠ±Π½Π΅Π΅ Π² [issue](https://github.com/satwikkansal/wtfpython/issues/68)).