Есть ли Python, эквивалентный символам Ruby?
есть ли Python, эквивалентный символам Ruby?
Если да, то что это такое?
Если нет, то мы застряли с помощью строки в нашей ключи в только словари?
5 ответов:
нет, python не имеет типа символа.
однако строковые литералы являются интернированы по умолчанию и другие строки могут быть интернированы с помощью
intern
как говорили другие, в Python нет символа, но строки работают хорошо.
чтобы избежать цитирования строк в качестве ключей, используйте синтаксис конструктора dict ():
d = dict( a = 1, b = 2, c = "Hello there", )
также для тех, кто заинтересован: символы в 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.
не как первоклассный тип, но существует https://pypi.python.org/pypi/SymbolType.