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

新手上路,请多包涵

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

根据我的实验,似乎应该始终使用 [] 来获取索引 listset 一个 dictionary 。这是正确的,如果不是,你什么时候在 Python 中使用 .

原文由 Startec 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.2k
2 个回答

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

>>> 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

…我们得到一个错误(这是有道理的,因为复数没有明显的方法来拥有成员)。

It’s possible to define how [] and . access work in a user-defined class, using the special methods __getitem__() and __getattr__() respectively.解释如何这样做超出了这个问题的范围,但您可以在 Python 教程 中阅读更多相关信息。

原文由 Zero Piraeus 发布,翻译遵循 CC BY-SA 3.0 许可协议

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

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

一般来说,惯例是 [] 用于“开放式”数据存储,您事先不知道该对象将保存多少数据或数据类型; . 更常用于对象“天生”具有的特定数据,并使用预定义的名称进行访问。例如,只知道列表中的某物并不能告诉您其中的内容(为此您使用 [] ),但它确实告诉您可以附加到它(并访问 append 方法你使用 . )。

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

原文由 BrenBarn 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题