Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Python

เหตุใดฟังก์ชัน Python จึงแฮชได้และอย่างไร


มีการกล่าวถึงวัตถุว่าสามารถแฮชได้หากมีค่าแฮชที่ยังคงเหมือนเดิมตลอดอายุการใช้งาน มันมีเมธอด __hash__() และสามารถเปรียบเทียบกับอ็อบเจ็กต์อื่นได้ สำหรับสิ่งนี้ มันต้องการเมธอด __eq__() หรือ __cmp__() หากเปรียบเทียบวัตถุที่แฮชได้จะเท่ากัน ก็จะมีค่าแฮชเท่ากัน

ความสามารถในการแฮชได้ทำให้ออบเจ็กต์สามารถใช้เป็นคีย์พจนานุกรมและเป็นสมาชิกชุดได้ เนื่องจากโครงสร้างข้อมูลเหล่านี้ใช้ค่าแฮชภายใน

ออบเจ็กต์ในตัวที่ไม่เปลี่ยนรูปทั้งหมดใน python สามารถแฮชได้ คอนเทนเนอร์ที่เปลี่ยนแปลงได้ เช่น รายการและพจนานุกรมจะไม่สามารถแฮชได้ ในขณะที่คอนเทนเนอร์ทูเพิลที่ไม่เปลี่ยนรูปนั้นสามารถแฮชได้

ออบเจ็กต์ที่เป็นอินสแตนซ์ของคลาสที่ผู้ใช้กำหนดสามารถแฮชได้โดยค่าเริ่มต้น พวกเขาทั้งหมดเปรียบเทียบไม่เท่ากัน (ยกเว้นกับตัวเอง) และค่าแฮชได้มาจาก id()

เห็นได้ชัดว่าแฮชไม่จำเป็นต้องเป็น ID ของฟังก์ชัน:พิจารณาให้ฟังก์ชันแลมบ์ดากำหนด

ตัวอย่าง

m = lambda x: 1
print hash(m)
print id(m)
print m.__hash__()

ผลลัพธ์

1265925722
3074942372
1265925722

แสดงว่าฟังก์ชันแลมบ์ดาสามารถแฮชได้

ตัวอย่าง

ตอนนี้ให้เราพิจารณารับฟังก์ชัน f() ดังนี้

def f():pass
print type(f)
print f.__hash__()
print hash(f)

ผลลัพธ์

<type 'function'>
1265925978
1265925978

นี่แสดงว่าฟังก์ชันใดๆ สามารถแฮชได้ เนื่องจากมีค่าแฮชที่ยังคงเหมือนเดิมตลอดอายุการใช้งาน