一、我不是我
現在,我們在互動模式下分別定義兩個變數:a,b,他們的值都等于200:

然后判斷a和b是否是參考的同一物件,并列印出來:

很顯然a和b參考的是同一物件,所以回傳的結果為true
是不是覺得我在說廢話!!!
下面就是見證奇跡的時候了:
我們再分別定義a和b,他們的值都等于257:

這個時候再判斷是否是參考的同一物件:

竟然不是了!!!

這到底是為什么呢???
現在為你解答:
這其實是python的整數緩沖區導致的結果,
python在互動模式下,會對比較小的整數物件進行快取([-5,256])
當我們定義的整數不在這個范圍時,python會新生成一個物件,獨占一個記憶體地址,
所以,雖然剛剛我們讓a和b都等于了257,但因為是分別定義的,兩個257的記憶體地址是不同的,所以a 不是b,回傳False,
我們列印兩個a和b的id就會發現,他們是不一樣的:

如果我們判斷a和b的值是否相等,那回傳的就會是true:

或者通過:a=b=257,這樣再通過is判斷是否參考的同一物件,就不會回傳False了

另外,通過編譯器(Pycharm、idle)或者保存為檔案執行時,結果是不一樣的,這是因為解釋器做了優化,不會因此分配新的記憶體地址,
二、空字串的數量竟然不是零?
現在定義一個變數str1,等于:aabbc,然后列印a的數量:
str1='aabbc'
print("數量為:",str1.count("a"))
-----------------輸出結果-----------------
數量為: 2
結果為str1中有兩個a
現在又是見證奇跡的時候了!!!
我們列印空字串的數量:
str1='aabbc'
print("數量為:",str1.count(""))
-----------------輸出結果-----------------
數量為: 6
為什str1中有6個空字串!!!
難道通靈了???
現在把str1的值改為:ab,再列印空字串的數量
str1='ab'
print("數量為:",str1.count(""))
-----------------輸出結果-----------------
數量為: 3
怎么又變成3了!!!

----------------------經過評論區大佬的解答,終于找到原因了----------------------
我們需要去看python的原始碼這種情況是怎么處理的
當我們通過count統計字符的數量時,會呼叫stringlib_count這個函式
而查詢空字串的時候,代表下圖的sub_len=0
所以會執行下面的代碼,會回傳被查詢字串的長度+1

py原始碼中的寫法

原來如此!!!
三、字串是個串列?
我們定義一個變數a,它的值為:hello world:
a = 'hello world'
然后列印a[0]:
a = 'hello world'
print('a[0]的值為:',a[0])
-----------------輸出結果-----------------
a[0]的值為: h
但是輸出a的型別卻是個str:
a = 'hello world'
print(type(a))
-----------------輸出結果-----------------
a的型別為: <class 'str'>

其實字串是字符的有序集合,可以通過其位置來獲得具體的元素,
在 python 中,字串中的字符是通過索引來提取的,索引從 0 開始,
當然也可以輸入負值,表示從末尾提取,最后一個為 -1,倒數第二個為 -2:
a = 'hello world'
print('a的末尾字母為:',a[-1])
-----------------輸出結果-----------------
a的末尾字母為: d
就是這么神奇!!!
分享暫時到這里,小伙伴們點贊、收藏、評論是對我最大的支持!!
四、往期文章回顧
python-20行代碼將圖片轉素描畫(附原始碼和成品下載地址)
python小爬蟲-28行代碼實作圖形化在線翻譯!
python-85行代碼完成貪吃蛇和關卡升級:是男人就堅持到第10關!
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/292353.html
標籤:python
