我来自JavaScript背景(在JavaScript中,属性可以通过.
和[]
符号访问),所以请原谅我,但是在Python中这两者有什么区别呢?
从我的实验中看来,无论是获取list
或set
的索引还是从dictionary
中获取某个键对应的值,似乎都应该使用[]
。这是正确的吗?如果不是,那么什么时候在Python中使用.
呢?
我来自JavaScript背景(在JavaScript中,属性可以通过.
和[]
符号访问),所以请原谅我,但是在Python中这两者有什么区别呢?
从我的实验中看来,无论是获取list
或set
的索引还是从dictionary
中获取某个键对应的值,似乎都应该使用[]
。这是正确的吗?如果不是,那么什么时候在Python中使用.
呢?
>>> c = 3+4j
其中之一是两个属性real
和imag
:
>>> 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教程中了解更多信息。
.
用于访问属性(包括方法)。[]
用于访问所谓的“项”,通常是各种容器对象中的内容。
JavaScript 不区分这两个概念,但 Python 区分它们。你正确地指出了 []
用于访问列表或字典中的数据。例如,.
用于访问像 list.append
和 dict.update
这样的方法。它还用于访问其他类型对象上的数据;例如,已编译的正则表达式对象有一个名为 pattern
的属性,其中包含正则表达式模式(可以使用 rx.pattern
访问它)。
通常的惯例是,[]
用于“开放式”数据存储,其中你无法提前知道对象将保存多少或何种类型的数据;.
更常用于具有“本质”特性的特定数据,并使用预定义的名称进行访问。例如,仅知道某物是列表并不能告诉你其中有什么内容(需要使用 []
),但它确实告诉你可以附加到它上面(并且要访问附加方法,需要使用 .
)。
Python 和 JavaScript 在这方面的另一个主要区别是,在 Python 中,对象可以自定义 .
和 []
的行为。因此,如果 obj
是定义了它们自己的行为的对象,则 obj.foo
或 obj[foo]
可能会执行一些特殊操作。有各种自定义类型使用这个功能来实现其自己的目的。
[]
是容器(如列表或字典)的索引。
.
是对象和模块的成员。它可以是方法、成员数据或属性。
>>> xs = [1, 7, 3, 4, 5, 4, 3, 4, 1]
>>> xs.count(4)
3
>>> xs[1]
7
实际上,Python使用方括号来包含一个键。对于列表,这是一个整数(无符号)索引或一个切片,而对于字典,这是一个(可哈希的)对象,如字符串、元组等,甚至是一个整数(单个和无符号的)。 这对于许多其他使用类似或甚至相同语法的语言来说都很简单。
.
用于访问对象的成员,就像C++、C、Java、JavaScript等语言一样。编写一个允许使用点语法访问其元素的字典类将非常简单。但是,为此,键必须是有效的Python标识符(letter { letter | digit |
_ })
。
然而,这并不常见。
集合不支持索引,因为它在内部没有排序,并且“键”和“值”之间没有关系。 对于列表,您不会“获取索引”,但是您会“获取索引的值”。对于字典,这类似,但“索引”更灵活。但是,字典不允许切片,并且(与集合一样)是无序的。
附注:Python使用内部字典来组织对象的成员。只需在控制台上尝试:
class MyClass:
def myfunc(self):
pass
print(MyClass.__dict__)
您将获得此类的所有属性(名称:值)。请注意myfunc
的条目。
[]
来访问索引和创建列表。使用.
来访问对象方法。 - rafaelc.
一般用于属性,而不仅仅是方法。 - too honest for this site