Есть ли эквивалент Python для символов Ruby?

Есть ли эквивалент Python для символов Ruby?

  • Если да, то что это такое?

  • Если нет, то мы застряли с использованием строк как наши ключи только в словарях?

Ответ 1

Нет, у python нет символьного типа.

Однако строковые литералы интернированы по умолчанию, а другие строки могут быть интернированы с помощью функции intern. Поэтому использование строковых литералов в качестве ключей в словарях не менее эффективно, чем использование символов в рубине.

Ответ 2

Как говорили другие, в Python нет символа, но строки работают хорошо.

Чтобы избежать цитирования строк как ключей, используйте синтаксис конструктора dict():

d = dict(
    a = 1,
    b = 2,
    c = "Hello there",
    )

Ответ 3

  • Нет, нет эквивалента.
  • Нет, вы можете использовать каждый хешируемый объект в качестве словарного ключа.

Ответ 4

Также для интересующихся: символы в Ruby при использовании в хэше очень похожи на пустые объекты в python. Например, вы можете сделать:

some_var = object()

а затем установите ключ словаря как some_var:

some_dict = { some_var : 'some value' }

а затем выполните стандартный поиск:

some_dict[some_var]

Однако, поскольку sepp2k отметил, что в этом нет никакой выгоды от производительности. На самом деле я сделал быстрый тест и мало что добавил к увеличению производительности:

a, b, c, d, e = [object() for _ in range(5)]
dict_symbols = {a : 'a', b : 'b', c : 'c', d : 'd', e : 'e'}
dict_strings = {'a' : 'a', 'b' : 'b', 'c' : 'c', 'd' : 'd', 'e' : 'e'}

def run_symbols():
    for key in dict_symbols.keys():
        dict_symbols[key]

def run_strings():
    for key in dict_strings.keys():
        dict_strings[key]

Скорость, протестированная в ipython:

In [3]: %timeit run_symbols
10000000 loops, best of 3: 33.2 ns per loop

In [4]: %timeit run_strings
10000000 loops, best of 3: 28.3 ns per loop

Итак, в моем случае "символы" работают медленнее! (для забавных номеров, неточно). Однако следует отметить, что, вероятно, существуют преимущества памяти для этого. Если вы не заботитесь о том, что объекты типа ключа имеют меньший размер, чем строки.

import sys
sys.getsizeof('some_var') # 45
some_var = object() 
sys.getsizeof(some_var) # 0

Хотя это ставит вопрос о том, как python обрабатывает память имени переменной some_var.