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

What's the difference between the square bracket and dot notations in Python?

我来自 Javascript 背景(可以通过 .[] 表示法访问属性),所以请原谅我,但到底有什么区别两者之间 Python?

根据我的实验,似乎应该始终使用 [],既可以获取 listset 的索引,也可以从某个键中获取值dictionary。这是否正确,如果不正确,您什么时候在 Python 中使用 .

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

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

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

>>> xs.count(4)
3

>>> xs[1]
7

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

JavaScript 不区分这两个东西,但是 Python 区分。 [] 用于访问列表或字典中的数据是正确的。例如,. 用于访问 list.appenddict.update 等方法。它还用于访问其他类型对象的其他数据;例如,已编译的正则表达式对象有一个包含正则表达式模式的 pattern 属性(您可以使用 rx.pattern 访问它)。

一般来说,惯例是 [] 用于 "open-ended" 数据存储,在这种情况下,您无法提前知道对象将保存多少数据或数据类型; . 更常用于对象具有 "by nature" 且使用预定义名称访问的特定数据。例如,仅仅知道列表中的某物并不能告诉你它里面有什么(你使用 []),但它确实告诉你你可以追加到它(并访问你使用的追加方法.).

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

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

>>> 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__() and __getattr__() respectively. Explaining how to do so is beyond the scope of this question, but you can read more about it in the Python Tutorial.

定义 []. 访问在用户定义的 class 中的工作方式

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

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

集合不支持索引,因为它在内部没有排序并且 "key" 和 "value" 之间没有关系。 对于列表,您不需要 "get the index",但可以 "get the value for an index"。对于字典,这是类似的,但 "index" 更灵活。但是,dict 不允许切片并且(像集合一样)是无序的。

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

class MyClass:
    def myfunc(self):
        pass

print(MyClass.__dict__)

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

的条目