【问题标题】:What's the difference between the square bracket and dot notations in Python?Python中的方括号和点符号有什么区别?
【发布时间】:2015-07-26 20:00:46
【问题描述】:

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

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

【问题讨论】:

  • (基本上)使用[] 来访问索引和创建列表。使用. 访问对象方法
  • @RafaelCardoso: . 一般用于属性,而不仅仅是方法。

标签: python object collections attributes member


【解决方案1】:

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

>>> 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 中阅读更多相关信息。

【讨论】:

  • 另外值得注意的是,您可以通过实现__getitem__(对于[])和__getattr__(对于.)方法来覆盖用户定义类中这些运算符的行为。跨度>
  • 来自文档:Attribute referencesSubscriptions
  • 你知道为什么 Python 开发者选择做出这种区分,或者为什么 Javascript 开发者选择不这样做吗?
【解决方案2】:

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

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

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

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

class MyClass:
    def myfunc(self):
        pass

print(MyClass.__dict__)

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

【讨论】:

    【解决方案3】:

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

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

    一般来说,约定是[] 用于“开放式”数据存储,您事先不知道该对象将保存多少或什么样的数据; . 更常用于对象“本质上”具有的特定数据,并使用预定义的名称进行访问。例如,只知道列表中的某些内容并不能告诉您其中有什么(您使用[]),但它确实告诉您可以追加到它(并访问您使用的追加方法@987654332 @)。

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

    【讨论】:

      【解决方案4】:

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

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

      >>> xs = [1, 7, 3, 4, 5, 4, 3, 4, 1]
      
      >>> xs.count(4)
      3
      
      >>> xs[1]
      7
      

      【讨论】:

        猜你喜欢
        • 2014-04-18
        • 2012-02-12
        • 2016-06-26
        • 2013-04-01
        • 2021-05-12
        • 1970-01-01
        • 2021-05-16
        相关资源
        最近更新 更多