我讀通過Python文檔,並且,Section 8.4.1下, 我發現下面__init__
定義(略):爲什麼要在__init__中聲明兩次列表?
class ListBasedSet(collections.abc.Set):
''' Alternate set implementation favoring space over speed
and not requiring the set elements to be hashable. '''
def __init__(self, iterable):
self.elements = lst = []
for value in iterable:
if value not in lst:
lst.append(value)
我不明白的部分是self.elements = lst = []
線。爲什麼是雙重任務?
添加一些打印語句:
def __init__(self, iterable):
self.elements = lst = []
print('elements id:', id(self.elements))
print('lst id:', id(lst))
for value in iterable:
if value not in lst:
lst.append(value)
一個聲明:
ListBasedSet(range(3))
elements id: 4741984136
lst id: 4741984136
Out[36]: <__main__.ListBasedSet at 0x11ab12fd0>
正如預期的那樣,它們都指向相同的PyObject。
簡潔是做這種事的唯一理由嗎?如果不是,爲什麼?與重入有關嗎?
可能保存屬性l ookup – vaultah
查找屬性需要花費嗎? – Ben
python被解釋。並且地址必須被計算:對象地址+成員偏移量。如果您將參考預先計算爲局部變量,則不必這樣做。在這個邪惡的世界裏,沒有什麼是免費的 –