|
1 |
| -<p align="center"><img src="images/logo.png" alt=""></p> |
| 1 | +<p align="center"><img src="/images/logo.png" alt=""></p> |
2 | 2 | <h1 align="center">What the f*ck Python! 🐍</h1>
|
3 | 3 | <p align="center">An interesting collection of surprising snippets and lesser-known Python features.</p>
|
4 | 4 |
|
@@ -338,7 +338,7 @@ Makes sense, right?
|
338 | 338 | * All length 0 and length 1 strings are interned.
|
339 | 339 | * Strings are interned at compile time (`'wtf'` will be interned but `''.join(['w', 't', 'f']` will not be interned)
|
340 | 340 | * 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)
|
341 |
| - <img src="images/string-intern/string_intern.png" alt=""> |
| 341 | +  |
342 | 342 | + 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).
|
343 | 343 | + 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`
|
344 | 344 | + 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 20. (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.
|
@@ -892,11 +892,11 @@ We didn't assign three `"X"`s, did we?
|
892 | 892 |
|
893 | 893 | When we initialize `row` variable, this visualization explains what happens in the memory
|
894 | 894 |
|
895 |
| - |
| 895 | + |
896 | 896 |
|
897 | 897 | 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`)
|
898 | 898 |
|
899 |
| - |
| 899 | + |
900 | 900 |
|
901 | 901 | 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).
|
902 | 902 |
|
@@ -3507,4 +3507,4 @@ If you like wtfpython, you can use these quick links to share it with your frien
|
3507 | 3507 |
|
3508 | 3508 | ## More content like this?
|
3509 | 3509 |
|
3510 |
| -If you're interested in more content like this, you can share your email [here](https://satwikkansal.xyz/wtfpython-pdf/). |
| 3510 | +If you're interested in more content like this, you can share your email [here](https://satwikkansal.xyz/content-like-wtfpython/). |
0 commit comments