Python中方括号和点符号表示法有什么区别?

74

我来自JavaScript背景(在JavaScript中,属性可以通过.[]符号访问),所以请原谅我,但是在Python中这两者有什么区别呢?

从我的实验中看来,无论是获取listset的索引还是从dictionary中获取某个键对应的值,似乎都应该使用[]。这是正确的吗?如果不是,那么什么时候在Python中使用.呢?


(基本上)使用[]来访问索引和创建列表。使用.来访问对象方法。 - rafaelc
@RafaelCardoso:. 一般用于属性,而不仅仅是方法。 - too honest for this site
4个回答

58
点运算符用于访问任何对象的属性。例如,复数
>>> 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教程中了解更多信息。


3
值得注意的是,您可以通过实现 __getitem__ 方法(用于 [] 运算符)和 __getattr__ 方法(用于 . 运算符)来覆盖用户定义类中这些运算符的行为。 - augurar
从文档中:属性引用订阅 - wwii
1
你知道为什么Python开发者选择做出这种区分,或者为什么Javascript开发者选择不这样做吗? - HRoot

21

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

JavaScript 不区分这两个概念,但 Python 区分它们。你正确地指出了 [] 用于访问列表或字典中的数据。例如,. 用于访问像 list.appenddict.update 这样的方法。它还用于访问其他类型对象上的数据;例如,已编译的正则表达式对象有一个名为 pattern 的属性,其中包含正则表达式模式(可以使用 rx.pattern 访问它)。

通常的惯例是,[] 用于“开放式”数据存储,其中你无法提前知道对象将保存多少或何种类型的数据;. 更常用于具有“本质”特性的特定数据,并使用预定义的名称进行访问。例如,仅知道某物是列表并不能告诉你其中有什么内容(需要使用 []),但它确实告诉你可以附加到它上面(并且要访问附加方法,需要使用 .)。

Python 和 JavaScript 在这方面的另一个主要区别是,在 Python 中,对象可以自定义 .[] 的行为。因此,如果 obj 是定义了它们自己的行为的对象,则 obj.fooobj[foo] 可能会执行一些特殊操作。有各种自定义类型使用这个功能来实现其自己的目的。


10

[]是容器(如列表或字典)的索引。

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

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

>>> xs.count(4)
3

>>> xs[1]
7

0

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

. 用于访问对象的成员,就像C++、C、Java、JavaScript等语言一样。编写一个允许使用点语法访问其元素的字典类将非常简单。但是,为此,键必须是有效的Python标识符(letter { letter | digit | _ })。 然而,这并不常见。

集合不支持索引,因为它在内部没有排序,并且“键”和“值”之间没有关系。 对于列表,您不会“获取索引”,但是您会“获取索引的值”。对于字典,这类似,但“索引”更灵活。但是,字典不允许切片,并且(与集合一样)是无序的。

附注:Python使用内部字典来组织对象的成员。只需在控制台上尝试:

class MyClass:
    def myfunc(self):
        pass

print(MyClass.__dict__)

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接