【Python初級】由判定迴文數想到的,關於深淺複製,以及字串反轉的問題

黃烤鴨發表於2018-06-27

嘗試用Python實現可以說是一個很經典的問題,判斷迴文數。

讓我們再來看看回文數是怎麼定義的:

回數是指從左向右讀和從右向左讀都是一樣的數,例如1,121,909,666等

解決這個問題的思路,可以說大體上分為兩種:

1.從首部和尾部同時向中間靠攏,判定首尾數字是否相等(比較複雜)

2.直接反轉數字,看反轉前反轉後數字是否相等(最常用)

第一種方法也可以理解為一種更加複雜,但是思想不變的第二種方法。

其中我一開始的程式碼是這樣寫的:

1 def is_palindrome(n):
2     L1=list(str(n))
3     L2=L1
4     L1.reverse()
5     if L2==L1:
6         return True
7     else:
8         return False

但後來發現無論傳入的是什麼數字,都會被判定為迴文數。一開始百思不得其解,後來無意中想起來了python中變數名是看作指向實際物件的指標,所以是不是程式碼中對L1內容的更改,L2指向的內容也會被一同發生更改呢?

 看了下面的這篇文章,恍然大悟

Python中“=”、淺複製與深複製的區別

然後import了copy包,並更改了程式碼,總算是正常了。正常的程式碼如下:

1 def is_palindrome(n):
2     L1=list(str(n))
3     L2=copy.deepcopy((L1))#我這裡使用的是深複製,其實淺複製在這個環境問題下也可以哦
4     L1.reverse()
5     if L2==L1:
6         return True
7     else:
8         return False

最後總算是能正常判定迴文數了。但還沒完,在網上看到了大神更加簡潔的程式碼:

1 def is_palindrome(n):
2     temp1=str(n)
3     return temp1==temp1[::-1]

為什麼能如此簡潔呢?原因就是,根據一開始提到的演算法,核心就在於字串的倒置。而利用python的切片功能,剛好可以方便的實現倒置,而且還不用考慮深淺複製問題。這裡也給大家貼一個介紹python中常見的字串倒置方法的博文(面試必備哦)

Python中字串倒置的常見方法(比較齊全)

 


相關文章