由 Rupesh Sharma 又名 @hackyrupesh
撰寫Python 以其簡單和美麗而成為世界上最受歡迎的程式語言之一。然而,即使到了 2024 年,某些缺陷仍然困擾著開發者。這些問題並不總是由於 Python 的弱點造成的,而是由於它的設計、行為或常見的誤解導致了意外的結果。在這篇部落格文章中,我們將了解每個開發人員在 2024 年仍然遇到的 5 大 Python 問題及其補救措施。
最臭名昭著的 Python 錯誤之一是可變的預設參數。當可變物件(如列表或字典)用作函數中的預設參數時,Python 僅在定義函數時計算此預設參數一次,而不是每次呼叫函數時都計算此預設參數。當函數修改物件時,這會導致意外的行為。
def append_to_list(value, my_list=[]): my_list.append(value) return my_list print(append_to_list(1)) # Outputs: [1] print(append_to_list(2)) # Outputs: [1, 2] - Unexpected! print(append_to_list(3)) # Outputs: [1, 2, 3] - Even more unexpected!
為了避免這種情況,請使用 None 作為預設參數,並根據需要在函數內建立新清單。
def append_to_list(value, my_list=None): if my_list is None: my_list = [] my_list.append(value) return my_list print(append_to_list(1)) # Outputs: [1] print(append_to_list(2)) # Outputs: [2] print(append_to_list(3)) # Outputs: [3]
嘗試存取不存在的字典鍵時會發生KeyError。當使用嵌套字典或處理結構無法保證的資料時,這可能特別棘手。
data = {'name': 'Alice'} print(data['age']) # Raises KeyError: 'age'
為了防止 KeyError,請使用 get() 方法,如果找不到金鑰,則該方法將傳回 None (或指定的預設值)。
print(data.get('age')) # Outputs: None print(data.get('age', 'Unknown')) # Outputs: Unknown
對於嵌套字典,請考慮使用集合模組或 dotmap 或 pydash 等函式庫中的 defaultdict。
from collections import defaultdict nested_data = defaultdict(lambda: 'Unknown') nested_data['name'] = 'Alice' print(nested_data['age']) # Outputs: Unknown
過度使用或誤用 try- except 區塊可能會導致靜默錯誤,即捕獲異常但未正確處理異常。這可能會使錯誤難以檢測和調試。
try: result = 1 / 0 except: pass # Silently ignores the error print("Continuing execution...")
在上面的範例中,ZeroDivisionError 被捕獲並忽略,但這可以掩蓋潛在的問題。
始終指定您要捕獲的異常類型,並適當處理它。記錄錯誤還可以幫助追蹤問題。
try: result = 1 / 0 except ZeroDivisionError as e: print(f"Error: {e}") print("Continuing execution...")
對於更廣泛的異常處理,您可以使用日誌記錄而不是傳遞:
import logging try: result = 1 / 0 except Exception as e: logging.error(f"Unexpected error: {e}")
在Python 3之前,兩個整數相除預設執行向下取整除法,將結果截斷為整數。儘管 Python 3 透過真正的除法 (/) 解決了這個問題,但一些開發人員在無意中使用樓層除法 (//) 時仍然面臨問題。
print(5 / 2) # Outputs: 2.5 in Python 3, but would be 2 in Python 2 print(5 // 2) # Outputs: 2
除非您特別需要樓層劃分,否則請務必使用 / 進行劃分。將程式碼從 Python 2 移植到 Python 3 時要小心。
print(5 / 2) # Outputs: 2.5 print(5 // 2) # Outputs: 2
為了獲得清晰且可預測的程式碼,請考慮使用decimal.Decimal進行更準確的算術運算,尤其是在財務計算中。
from decimal import Decimal print(Decimal('5') / Decimal('2')) # Outputs: 2.5
Python 的垃圾收集器處理大部分記憶體管理,但如果處理不當,循環引用可能會導致記憶體洩漏。當兩個或多個物件相互引用時,它們可能永遠不會被垃圾回收,從而導致記憶體使用量增加。
class Node: def __init__(self, value): self.value = value self.next = None node1 = Node(1) node2 = Node(2) node1.next = node2 node2.next = node1 # Circular reference del node1 del node2 # Memory not freed due to circular reference
為了避免循環引用,請考慮透過weakref模組使用弱引用,該模組允許在不存在強引用時對引用進行垃圾收集。
import weakref class Node: def __init__(self, value): self.value = value self.next = None node1 = Node(1) node2 = Node(2) node1.next = weakref.ref(node2) node2.next = weakref.ref(node1) # No circular reference now
或者,您可以在刪除物件之前透過將引用設為 None 來手動打破循環。
node1.next = None node2.next = None del node1 del node2 # Memory is freed
Even in 2024, Python developers continue to encounter these common bugs. While the language has evolved and improved over the years, these issues are often tied to fundamental aspects of how Python works. By understanding these pitfalls and applying the appropriate solutions, you can write more robust, error-free code. Happy coding!
Written by Rupesh Sharma AKA @hackyrupesh
以上是每個開發人員仍然面臨的 ython 錯誤以及如何修復它們)的詳細內容。更多資訊請關注PHP中文網其他相關文章!