set.add
set.add
dodaje indywidualny element do zestawu. Tak więc, działa, ale nie działa z wartością iterowalną, chyba że jest nieszyfrowany. To jest powód, dla którego a.add([1, 2])
zawodzi.
>>> a.add([1, 2])
Traceback (most recent call last):
File "<input>", line 1, in <module>
TypeError: unhashable type: 'list'
Tutaj [1, 2]
jest traktowany jako element jest dodany do zestawu i jak mówi komunikat o błędzie, a list cannot be hashed ale oczekuje się, że wszystkie elementy zestawu być hashables. Cytowanie documentation,
Return a new set
or frozenset
object whose elements are taken from iterable. The elements of a set must be hashable .
set.update
W przypadku set.update
można przekazać wiele iterables do niego i będzie iteracyjne wszystkie iterables i będzie obejmować poszczególne elementy w zestawie. Pamiętaj: Może przyjmować tylko iterables. Dlatego otrzymujesz błąd podczas próby aktualizacji ją 1
>>> a.update(1)
Traceback (most recent call last):
File "<input>", line 1, in <module>
TypeError: 'int' object is not iterable
Ale dodaje będzie działać, ponieważ lista [1]
się powtórzyć i elementy listy są dodawane do zestawu.
>>> a.update([1])
>>> a
set([1])
set.update
jest w zasadzie odpowiednikiem operacji połączenia zestawu w miejscu. Rozważmy następujące przypadki:
>>> set([1, 2]) | set([3, 4]) | set([1, 3])
set([1, 2, 3, 4])
>>> set([1, 2]) | set(range(3, 5)) | set(i for i in range(1, 5) if i % 2 == 1)
set([1, 2, 3, 4])
Tutaj jawnie konwertujemy wszystkie iterables na sety, a następnie znajdujemy związek. Istnieje wiele pośrednich zestawów i związków. W tym przypadku set.update
służy jako dobra funkcja pomocnika. Ponieważ przyjmuje żadnych iterable, można po prostu zrobić
>>> a.update([1, 2], range(3, 5), (i for i in range(1, 5) if i % 2 == 1))
>>> a
set([1, 2, 3, 4])
Jakiej wersji Python używasz? Dla 'a.update (1)' oczekuję 'TypeError: 'int' object nie jest iterable', i dostałem go dla obu wersji próbowałem. –
@ theheyeye, twoja zmiana zmieniła trochę pytanie –
https://github.com/python/cpython/blob/master/Objects/setobject.c – satomacoto