yigal_s: (Default)
yigal_s ([personal profile] yigal_s) wrote2021-03-05 09:37 pm

Пайтон - я фигею без баяна

s = set()

for i in range(0,10) :
s.add('s'+str(i))
s.add(i)
for i in s :
print(i)

Тестовая программка на питоне. Можно её даже онлайн погонять: https://onlinegdb.com/ByVgsweQ_

При каждом прогоне выдаёт разную последовательность строк. При этом целые значения упорядочены от 0 до 9 (!), а между ними в случайном порядке (!!), всякий раз разном (!!!) располагаются строковые значения. Откровенно говоря, я даже не знаю, какой из этих трёх фактов выглядит более странным.

Вроде везде пишут, что Сеты в Питоне сделаны на хешах.

Как, как им всё это удалось сделать одновременно???

UPD: со строками вроде разобрался - их хеш в Пайтоне рандомизирован (борются с хаккерами).
При случайном закидывании последовательных целых, они оказываются в set упорядоченными, и это как-то мне всё же не нравится.
Осталось разобраться с целыми.

[identity profile] occuserpens.livejournal.com 2021-03-06 03:48 am (UTC)(link)
А питонские иденты Пушкин соблюдать будет? :)

# just because sets are unordered 
s = set()

for i in range(0,10):
    s.add('s'+str(i))
print (s)
Edited 2021-03-06 04:27 (UTC)

[identity profile] occuserpens.livejournal.com 2021-03-06 04:26 am (UTC)(link)
# same crap
s = []
for i in range(0,10):
    s.append('s'+str(i))
print (s)
ss = {*s}
print (ss)

[identity profile] ak-47.livejournal.com 2021-03-06 10:24 am (UTC)(link)
Если так невтерпёж разобраться, то можно посмотреть в сорцах. :)

Set по определению не гарантирует упорядоченности элементов. Поэтому надо наоборот спасибо сказать что пайтоновская имплементация забесплатно ещё и такие баги отловит.
Edited 2021-03-06 10:32 (UTC)