【Python】有趣且鮮為人知的 Python 特性,火了!
小編最近逛Github發(fā)現(xiàn)了一個(gè)給力的Python項(xiàng)目,絕對(duì)能讓你傻眼!可以通過這個(gè)項(xiàng)目測(cè)試你對(duì)Python的熟悉程度!
這個(gè)項(xiàng)目叫做 “What the f*ck Pytho
>>> a = 256
>>> b = 256
>>> a is b
True
>>> a = 257
>>> b = 257
>>> a is b
False
>>> a = 257; b = 257
>>> a is b
True
這是為啥呢?
因?yàn)?256 是一個(gè)已經(jīng)存在的對(duì)象, 而 257 不是。
大家可以想到256是2的8次方。
當(dāng)Python開啟后,-5~256數(shù)字已經(jīng)分配好對(duì)象了,主要考慮這些數(shù)字經(jīng)常使用。
引用自 https://docs.python.org/3/c-api/long.html
可以再看看這個(gè)案例:
>>> 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
大家都知道,在Python中通過id( )可以確定兩個(gè)變量存儲(chǔ)的內(nèi)容是否是同一個(gè),通過以上的代碼結(jié)果說(shuō)明創(chuàng)建了多個(gè)257對(duì)象。
你以為到這就結(jié)束了么?并沒有
再來(lái)繼續(xù)看這個(gè):
>>> a, b = 257, 257
>>> id(a)
140640774013296
>>> id(b)
140640774013296
>>> a = 257
>>> b = 257
>>> id(a)
140640774013392
>>> id(b)
140640774013488

# 我們先初始化一個(gè)變量row
row = [""]*3 #row i['', '', '']
# 并創(chuàng)建一個(gè)變量board
board = [row]*3
>>> board
[['', '', ''], ['', '', ''], ['', '', '']]
>>> board[0]
['', '', '']
>>> board[0][0]
''
>>> board[0][0] = "X"
>>> board
[['X', '', ''], ['X', '', ''], ['X', '', '']]
???這是為啥呢,我明明只給一個(gè)位置賦值了“X”啊!
大家應(yīng)該想到了原因!
當(dāng)我們初始化時(shí):

然后我們使用乘法初始化board變量時(shí),是這樣的:

也就是說(shuō),這三行都引用了row的內(nèi)存空間。
所以改變其中一個(gè)位置的值,也就改變了3個(gè)位置的值!
為了避免引用相同位置內(nèi)容,可以采用以下方法:
>>> board = [['']*3 for _ in range(3)]
>>> board[0][0] = "X"
>>> board
[['X', '', ''], ['', '', ''], ['', '', '']]
接著看下個(gè)案例吧:
神奇的三引號(hào)!
>>> print('wtfpython''')
wtfpython
>>> print("wtfpython""")
wtfpython
>>> # 下面的語(yǔ)句會(huì)拋出 `SyntaxError` 異常
>>> # print('''wtfpython')
>>> # print("""wtfpython")
補(bǔ)充個(gè)說(shuō)明,Python的隱式字符串連接:
>>> print("wtf" "python")
wtfpython
>>> print("wtf" "") # or "wtf"""
wtf
思考一下再看答案!
答案:''' 和 """ 在 Python中也是字符串定界符, Python 解釋器在先遇到三個(gè)引號(hào)的的時(shí)候會(huì)嘗試再尋找三個(gè)終止引號(hào)作為定界符, 如果不存在則會(huì)導(dǎo)致 SyntaxError 異常。
我們?cè)賮?lái)看下一個(gè)例子:
# 一個(gè)簡(jiǎn)單的例子, 統(tǒng)計(jì)下面可迭代對(duì)象中的布爾型值的個(gè)數(shù)和整型值的個(gè)數(shù)
mixed_list = [False, 1.0, "some_string", 3, True, [], False]
integers_found_so_far = 0
booleans_found_so_far = 0
for item in mixed_list:
if isinstance(item, int):
integers_found_so_far += 1
elif isinstance(item, bool):
booleans_found_so_far += 1
返回的結(jié)果是:
>>> integers_found_so_far
4
>>> booleans_found_so_far
0
???我的bool值都到哪去了?

其實(shí),布爾值是int的子類,看下面這個(gè)就懂了:
>>> isinstance(True, int)
True
>>> isinstance(False, int)
True
如果還沒理解,可以繼續(xù)往下看:
another_dict = {}
another_dict[True] = "JavaScript"
another_dict[1] = "Ruby"
another_dict[1.0] = "Python"
>>> another_dict[True]
"Python"
True 的整數(shù)值是 1, 而 False 的整數(shù)值是 0。
>>> True == 1 == 1.0 and False == 0 == 0.0
True
>>> some_bool = True
>>> "wtf"*some_bool
'wtf'
>>> some_bool = False
>>> "wtf"*some_bool
''
還有很多Python神奇的特性,大家自己看這個(gè)項(xiàng)目吧~
如果覺得項(xiàng)目作者寫的不錯(cuò),給他點(diǎn)亮star吧!
往期精彩回顧
本站qq群704220115,加入微信群請(qǐng)掃碼:
