2015-05-15 4 views
16

Я исхожу из фона Javascript (где можно получить доступ к объектам через . и []), поэтому, пожалуйста, простите меня, но в чем разница между ними в Python?В чем разница между квадратными скобками и точками в Python?

Из моего экспериментирования seeems, что [] всегда следует использовать, как получить индекс в list или set и получить значение из определенного ключа в dictionary. Это правильно, а если нет, то когда вы используете . в Python?

+0

(В принципе) используйте '[]' для доступа к индексам и для создания списков. Используйте '.' для доступа к методам объектов – RafaelC

+0

@RafaelCardoso:' .' для атрибутов в целом, а не только для методов. – Olaf

ответ

15

Оператор dot используется для доступа к атрибутам любого объекта.Например, комплексное число

>>> c = 3+4j 

имеет (среди прочих) эти два атрибута real и imag:

>>> c.real 
3.0 
>>> c.imag 
4.0 

а также тех, у него есть метод, conjugate(), который также является атрибутом:

>>> c.conjugate 
<built-in method conjugate of complex object at 0x7f4422d73050> 
>>> c.conjugate() 
(3-4j) 

Квадратные скобки обозначения используется для доступа к членам коллекции, будь это по ключу в случае словаря или дру эр отображение:

>>> d = {'a': 1, 'b': 2} 
>>> d['a'] 
1 

... или по индексу в случае последовательности, как список или строка:

>>> s = ['x', 'y', 'z'] 
>>> s[2] 
'z' 
>>> t = 'Kapow!' 
>>> t[3] 
'o' 

Эти коллекции также, отдельно, имеют атрибуты:

>>> d.pop 
<built-in method pop of dict object at 0x7f44204068c8> 
>>> s.reverse 
<built-in method reverse of list object at 0x7f4420454d08> 
>>> t.lower 
<built-in method lower of str object at 0x7f4422ce2688> 

... и, опять же, в приведенных выше случаях эти атрибуты являются методами.

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

>>> c[0] 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: 'complex' object is not subscriptable 

... мы получаем ошибку (что имеет смысл, так как нет никакого очевидного способа для комплексного числа к имеют членов).

Это можно определить как [] и . работа доступ в определенный пользователем класс, используя специальные методы __getitem__() и __getattr__() соответственно. Объяснение, как это сделать, выходит за рамки этого вопроса, но вы можете узнать больше об этом в Python Tutorial.

+1

Также стоит отметить, что вы можете переопределить поведение этих операторов в пользовательских классах, выполнив ['__getitem__'] (https://docs.python.org/2/reference/datamodel.html#object.__getitem__) (для '[]') и ['__getattr__'] (https://docs.python.org/2/reference/datamodel.html#object.__getattr__) (для' .') методов. – augurar

+0

@augurar хорошая точка; Я добавил короткий параграф. –

+0

Из документов: [Ссылки на атрибуты] (https://docs.python.org/3/reference/expressions.html#attribute-references) и [Подписки] (https://docs.python.org/3/reference /expressions.html#subscriptions) – wwii

3

[] - это указатель на контейнер, такой как список или словарь.

. является членом объекта и модулей. Это может быть метод, данные участника или атрибут.

>>> xs = [1, 7, 3, 4, 5, 4, 3, 4, 1] 

>>> xs.count(4) 
3 

>>> xs[1] 
7 
4

. используется для доступа атрибутов (включая методы). [] используется для доступа к так называемым «элементам», которые обычно представляют собой содержимое различных видов контейнерных объектов.

JavaScript не различает эти две вещи, но Python делает. Вы правы, что [] используется для доступа к данным в списке или dict. . используется, например, для доступа к таким методам, как list.append и dict.update. Он также используется для доступа к другим данным по другим видам объектов; например, скомпилированные объекты регулярного выражения имеют атрибут pattern, содержащий шаблон регулярного выражения (вы получите доступ к нему с помощью rx.pattern).

В общем, соглашение состоит в том, что [] используется для хранения данных с открытым кодом, где вы заранее не знаете, сколько или каких видов данных будет храниться объект; . чаще используется для конкретных данных, которые объект имеет «по своей природе» и к которому обращается с предопределенным именем. Например, просто зная, что что-то в списке не сообщает вам, что в нем (для чего вы используете []), но он говорит вам, что вы можете добавить к нему (и получить доступ к методу добавления, который вы используете .).

Другим важным отличием Python от JavaScript в этом отношении является то, что в Python поведение объектов . и [] может быть изменено объектом. Таким образом, obj.foo или obj[foo] могут делать что-то особенное, если obj - это объект, который определяет для них свое поведение. Существуют различные пользовательские типы, которые используют это для своих целей.

0

На самом деле, Python использует квадратные скобки, чтобы заключить ключ. Для списков это целочисленный (беззнаковый) индекс или срез, тогда как для dicts это (допустимый) объект, такой как строка, кортеж и т. Д. Или даже целое число (singe и unsigned). Это прямо на многих других языках, которые используют одинаковый или даже идентичный синтаксис.

. Используется для доступа к элементам объекта, как и для C++, C, Java, JavaScript и т. Д. Было бы довольно просто написать класс словаря, который позволяет использовать точечный синтаксис для доступа к его элементам , Однако для этого ключи должны быть действительными идентификатором Python (letter { letter | digit | _ }. Однако это не очень распространено.

Набор не поддерживает индексирование, поскольку он не упорядочен внутренне и не существует отношения между «ключом» и «значением». Для получения списка вы не «получите индекс», но вы «получите значение для индекса». Для dict это похоже, но «индекс» более гибкий. Тем не менее, dict не разрешает нарезку и является (как набор) неупорядоченным.

Sidenote: Python использует внутренний dict для объекта для организации своих членов. Просто попробуйте на консоли:

class MyClass: 
    def myfunc(self): 
     pass 

print(MyClass.__dict__) 

Вы получите все атрибуты (имя: значение) этого класса.Обратите внимание на запись для myfunc.

Смежные вопросы