Câu trả lời của Rob (được bình chọn nhiều nhất ở trên) là đúng. Tôi muốn nói thêm rằng trong một số trường hợp, sử dụng ID rất hữu ích vì nó cho phép so sánh các đối tượng và tìm đối tượng nào tham chiếu đến đối tượng của bạn.
Ví dụ sau này thường giúp bạn gỡ lỗi các lỗi lạ trong đó các đối tượng có thể thay đổi được truyền dưới dạng tham số để nói các lớp và được gán cho các vars cục bộ trong một lớp. Việc thay đổi các đối tượng đó sẽ làm thay đổi các vars trong một lớp. Điều này thể hiện ở hành vi kỳ lạ khi nhiều thứ thay đổi cùng một lúc.
Gần đây, tôi đã gặp sự cố này với ứng dụng Python / Tkinter trong đó việc chỉnh sửa văn bản trong một trường nhập văn bản đã thay đổi văn bản trong một trường khác khi tôi nhập :)
Đây là một ví dụ về cách bạn có thể sử dụng hàm id () để theo dõi các tham chiếu đó ở đâu. Bằng mọi cách, đây không phải là một giải pháp bao gồm tất cả các trường hợp có thể xảy ra, nhưng bạn có ý tưởng. Một lần nữa ID được sử dụng trong nền và người dùng không nhìn thấy chúng:
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()) )
ĐẦU RA:
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'}
Dấu gạch dưới trong tên biến được sử dụng để ngăn chặn các vùng tên. Các hàm sử dụng đối số "từ đâu" để bạn có thể cho chúng biết bắt đầu tìm kiếm tham chiếu từ đâu. Đối số này được điền bởi một hàm liệt kê tất cả các tên trong một vùng tên nhất định. Globals () là một trong những hàm như vậy.