Python中的方括号和点符号有什么区别?

时间:2015-05-15 01:52:25

标签: python object collections attributes member

我来自Javascript背景(可以通过.[]表示法访问属性),所以请原谅我,但究竟是什么,这两者在Python中有什么区别?

从我的实验中可以看出[]应始终使用,以获取listset的索引,并从{{{}获取某个键的值1}}。这是正确的,如果没有,你什么时候在Python中使用dictionary

4 个答案:

答案 0 :(得分:22)

点运算符用于访问任何对象的属性。例如,复数

>>> c = 3+4j

包含(以及其他)两个属性realimag

>>> 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 :(得分:5)

.用于访问属性(包括方法)。 []用于访问所谓的“items”,它通常是各种容器对象的内容。

JavaScript不区分这两件事,但Python确实如此。你是正确的[]用于访问列表或词典中的数据。例如,.用于访问list.appenddict.update等方法。它还用于访问其他类型对象的其他数据;例如,编译的正则表达式对象具有保持正则表达式模式的pattern属性(您可以使用rx.pattern访问它)。

一般来说,惯例是[]用于“开放式”数据存储,在这种情况下,您不会提前知道对象将保存多少或哪种类型的数据; .更常用于对象具有“本质上”且使用预定义名称访问的特定数据。例如,只知道列表中的某些内容并不会告诉您其中的内容(使用[]),但它确实告诉您可以附加到它(以及访问您使用的追加方法) .)。

在这方面,Python和JavaScript之间的另一个主要区别是,在Python中,.[]的行为可以由对象自定义。因此obj.fooobj[foo]可能会做一些特别的事情,如果obj是一个为其定义自己行为的对象。有各种自定义类型可以将它们用于自己的目的。

答案 2 :(得分:3)

[]是容器的索引,例如列表或字典。

.是对象和模块的成员。它可以是方法,成员数据或属性。

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

>>> xs.count(4)
3

>>> xs[1]
7

答案 3 :(得分:0)

实际上,Python使用方括号来包含一个键。对于列表,这是一个整数(无符号)索引或切片,而对于dicts,这是一个(可拥有的)对象,如字符串,元组等,甚至是整数(单个和无符号)。 对于使用类似甚至相同语法的许多其他语言来说,这是直截了当的。

.用于访问对象的成员,非常类似于C ++,C,Java,JavaScript等。编写允许使用点语法的字典类非常简单。访问其元素。但是,为此,密钥必须是有效的Python标识符(letter { letter | digit | _ }。 但是,这并不常见。

一个集合不支持索引,因为它不是内部排序的,并且&#34; key&#34;之间没有关系。和&#34;价值&#34;。 对于列表,您不会获得索引&#34;,但是您可以获得索引的值#34;。对于一个词典,这是相似的,但&#34;索引&#34;更灵活。但是,dict不允许切片,并且(像集合)无序。

旁注:Python使用内部字典对象来组织其成员。试试控制台:

class MyClass:
    def myfunc(self):
        pass

print(MyClass.__dict__)

您将获得此类的所有属性(名称:值)。请注意myfunc

的条目