Тема: Поясніть будь ласка нюанс в роботі set.intersection()

Поясніть будь ласка, чому в наведеному прикладі .intersection() дає порожній сет в разі пошуку перетинання із об'єктом 'abc', хоча такий же елемент 'abc' присутній в сеті my_set?
Якщо той же об'єкт 'abc' присвоїти змінній, .intersection() дає перетинання 'abc', як і очікувалося.

Приклад:

my_set = {'abc', 'd', 'f', 'y'}

new_set = {'abc'}

print(my_set.intersection('abc')) # set()

print(my_set.intersection(new_set)) #{'abc'}

Дякую за пояснення!

2

Re: Поясніть будь ласка нюанс в роботі set.intersection()

Ви питаєте, чому

> {'abc', 'd', 'f', 'y'}.intersection({'abc'})
{'abc'}

але

> {'abc', 'd', 'f', 'y'}.intersection('abc')
set()

Яким має бути тип аргументу set.intersection? За логікою set. Множина має працювати з множиною. Коли передається множина, то все добре. А коли передається не множина? Правильно, вона спершу перетворюється на множину (або ж для ефективності не перетворюється, але дії функції set.intersection аналогічні тим, які були б, якби перетворювалася). Подивимося, що при цьому стається:

> set('abc')
{'a', 'b', 'c'}

'abc' при цьому розглядається не як 1 елемент, а як набір з кількох символів. І цей набір перетворюється на множину.
Контольна перевірка:

> {'abc', 'b', 'c', 'd'}.intersection('abc')
{'b', 'c'}

Тут вже очевидно, що 'abc' перетворилося на {'a', 'b', 'c'}.

П.С. насправді аргумент має бути iterable, але все одно логіка саме така: стрічка розглядається як набір символів, а не як єдиний об'єкт.

Подякували: leofun011