คำตอบของ Rob (โหวตมากที่สุดด้านบน) ถูกต้อง ฉันต้องการเพิ่มว่าในบางสถานการณ์การใช้ ID จะมีประโยชน์เนื่องจากช่วยให้สามารถเปรียบเทียบวัตถุและค้นหาว่าวัตถุใดอ้างถึงวัตถุของคุณ
ในภายหลังมักจะช่วยคุณเช่นในการดีบักจุดบกพร่องแปลก ๆ โดยที่วัตถุที่เปลี่ยนแปลงไม่ได้จะถูกส่งผ่านเป็นพารามิเตอร์เพื่อพูดคลาสและถูกกำหนดให้กับตัวแปรโลคัลในคลาส การกลายพันธุ์วัตถุเหล่านั้นจะกลายพันธุ์ตัวแปรในคลาส สิ่งนี้แสดงออกมาในพฤติกรรมแปลก ๆ ที่มีหลายสิ่งเปลี่ยนแปลงในเวลาเดียวกัน
เมื่อเร็ว ๆ นี้ฉันมีปัญหากับแอพ Python / Tkinter ที่การแก้ไขข้อความในช่องป้อนข้อความหนึ่งเปลี่ยนข้อความในอีกช่องหนึ่งตามที่ฉันพิมพ์ :)
นี่คือตัวอย่างวิธีที่คุณอาจใช้ function id () เพื่อติดตามว่าการอ้างอิงเหล่านั้นอยู่ที่ใด โดยวิธีทั้งหมดนี้ไม่ใช่วิธีแก้ปัญหาที่ครอบคลุมทุกกรณี แต่คุณจะได้รับแนวคิด อีกครั้งมีการใช้ ID ในพื้นหลังและผู้ใช้ไม่เห็น:
class democlass:
classvar = 24
def __init__(self, var):
self.instancevar1 = var
self.instancevar2 = 42
def whoreferencesmylocalvars(self, fromwhere):
return {__l__: {__g__
for __g__ in fromwhere
if not callable(__g__) and id(eval(__g__)) == id(getattr(self,__l__))
}
for __l__ in dir(self)
if not callable(getattr(self, __l__)) and __l__[-1] != '_'
}
def whoreferencesthisclassinstance(self, fromwhere):
return {__g__
for __g__ in fromwhere
if not callable(__g__) and id(eval(__g__)) == id(self)
}
a = [1,2,3,4]
b = a
c = b
democlassinstance = democlass(a)
d = democlassinstance
e = d
f = democlassinstance.classvar
g = democlassinstance.instancevar2
print( 'My class instance is of', type(democlassinstance), 'type.')
print( 'My instance vars are referenced by:', democlassinstance.whoreferencesmylocalvars(globals()) )
print( 'My class instance is referenced by:', democlassinstance.whoreferencesthisclassinstance(globals()) )
เอาท์พุท:
My class instance is of <class '__main__.democlass'> type.
My instance vars are referenced by: {'instancevar2': {'g'}, 'classvar': {'f'}, 'instancevar1': {'a', 'c', 'b'}}
My class instance is referenced by: {'e', 'd', 'democlassinstance'}
ขีดล่างในชื่อตัวแปรใช้เพื่อป้องกันการจับคู่ชื่อ ฟังก์ชันใช้อาร์กิวเมนต์ "จากที่ใด" เพื่อให้คุณสามารถแจ้งให้พวกเขาทราบว่าจะเริ่มค้นหาข้อมูลอ้างอิงได้จากที่ใด อาร์กิวเมนต์นี้เต็มไปด้วยฟังก์ชันที่แสดงรายชื่อทั้งหมดในเนมสเปซที่กำหนด Globals () เป็นฟังก์ชันหนึ่ง