Если вам нужно другое поведение, когда вы имеете дело со значением типа, вам, очевидно, потребуется выполнить какой-то тест. Вам не нужна явная проверка для значений значений в коробке , так как все типы значений будут помещены в бокс ** из-за параметра, который вводится как object
.
Это код должен соответствовать вашим заявленным критериям: Если value
является типом (в штучной упаковке), то вызовите полиморфный метод Equals
, в противном случае используйте ==
для проверки ссылочного равенства.
public void SetValue(TEnum property, object value)
{
bool equal = ((value != null) && value.GetType().IsValueType)
? value.Equals(_properties[property])
: (value == _properties[property]);
if (!equal)
{
// Only come here when the new value is different.
}
}
( ** И, да, я знаю, что Nullable<T>
является ценностным типом со своими собственными специальными правилами, касающимися бокса и распаковки, но здесь это почти не имеет значения.)
То, что вы ищете, это random.choices
- Новое в Python версии 3.6 . - определение функции ниже; и вы можете прочитать больше здесь .
random.choices(population, weights=None, *, cum_weights=None, k=1)
Вы можете назначить weights
для того, чтобы дать определенному элементу приоритет над другими. - Хотя я полагаю, что приведенный ниже пример удовлетворит ваши потребности.
Пример
import random
random.choices([1, 2, 3, 4], k=4)
Альтернативно в старых версиях Python вы можете использовать random.choice
, как показано ниже; хотя он просто поддерживает один аргумент, последовательность.
Пример
import random
population = [1, 2, 3, 4, 5]
def choices(population, k=1):
return [random.choice(population) for _ in range(k)] if k > 1 else random.choice(population)
choices(population, k=5)
Выход
[2, 4, 2, 5, 1]
Вы можете использовать numpy.random.choice
import numpy as np
x = [10, 20, 30, 40, 50]
print(np.random.choice(x, 4, replace=True))
Вывод:
[50 50 30 30]
sample
- неправильный инструмент, как вы видели. Вместо этого вы можете использовать choices
:
choices([10, 20, 30, 40, 50], k=4)