Как Python *на самом деле* определяет порядок при создании списка из набора в Python 3.9+ [дубликат] ⇐ Python

Программы на Python
Anonymous
Как Python *на самом деле* определяет порядок при создании списка из набора в Python 3.9+ [дубликат]

Сообщение Anonymous »

Мне было любопытно это, потому что знание ответа, возможно, поможет при тестировании моего проекта Python, который использует наборы и иногда преобразует их в списки. Я не уверен, как это работает, потому что результат кода, описанного ниже, не соответствует ничему, что я мог найти в Интернете.
Странный эффект, который я испытываю, заключается в том, что выходные данные программы ниже зависит от значения Orange. Интересно, получают ли другие пользователи то же самое, но я получаю прокомментированный вывод ниже в зависимости от значения Orange. Я получаю один и тот же результат в 100% случаев. Кто-нибудь знает, что здесь происходит и/или как получить согласованный вывод, который не будет зависеть от значения Orange (потому что я хотел бы вставить код отладки вместо Orange и не менять вывод)

Код: Выделить всё

import numpy as np

class Banana(object):
def __init__(self, label):
self.label = label

def __repr__(self):
return 'Banana(label={})'.format(self.label)

class Apple(object):
def __init__(self):
self._bananas = {1:set()}

def add_banana(self, banana: "Banana"):
self._bananas[1].add(banana)

@property
def print_bananas(self) -> list["Banana"]:
result = set()
for banana in self._bananas.values():
result |= banana
return list(result)

Lemon = 11
for i in range(10):
Orange = 4
A = Apple()
B1 = Banana(1)
B2 = Banana(2)
B3 = Banana(3)
A.add_banana(B1)
A.add_banana(B2)
A.add_banana(B3)
print(A.print_bananas[0].label)

#result with Orange = 5: 3,3,2,1,2,3,3,2,1,2
#result with Orange = 4: 3,3,3,1,2,3,3,3,1,2
Я знаю, что отладка — не очень хорошая идея, если вы хотите проверить наличие ошибок, которые проявляются только иногда (хотя я использую некоторую рандомизацию для большинства случайных элементов, таких как np.random, я могу просто исправить начальное число). Но я надеюсь, что, видя, что результат можно в некоторой степени исправить, есть способ полностью его исправить. То, что я смог найти в Интернете, зависит от переменной среды PYHTONHASHSEED (например, здесь). Я попытался установить для PYTHONHASHSEED значение 0 в переменных среды в PyCharm и несколько раз перезапустить Python, но это не повлияло на результат. Я где-то читал, что PYTHONHASHSEED будет отключен после Python 3.8, но не помню, где я это читал. Я использую Python 3.10 и Pycharm Community Edition 2021.3.2
Примечание: воспроизвести такое поведение было довольно сложно, кажется, что оно происходит только для определенных значений Lemon и/или Orange, и возможно, зависит от вашей системы, если и когда оно появится. Для меня странное поведение проявляется как в Windows 11, так и в Linux Mint (с немного разными выводами). Результаты в Анаконде всегда казались случайными, и для одного из рецензентов они всегда были одинаковыми для Дарвина.

Подробнее здесь: https://stackoverflow.com/questions/790 ... m-a-set-in

Вернуться в «Python»