Python 中的方括号和点符号有什么区别?
What's the difference between the square bracket and dot notations in Python?
我来自 Javascript 背景(可以通过 .
和 []
表示法访问属性),所以请原谅我,但到底有什么区别两者之间 Python?
根据我的实验,似乎应该始终使用 []
,既可以获取 list
或 set
的索引,也可以从某个键中获取值dictionary
。这是否正确,如果不正确,您什么时候在 Python 中使用 .
?
[]
是容器的索引,例如列表或字典。
.
是对象和模块的成员。它可以是方法、成员数据或属性。
>>> xs = [1, 7, 3, 4, 5, 4, 3, 4, 1]
>>> xs.count(4)
3
>>> xs[1]
7
.
用于访问属性(包括方法)。 []
用于访问所谓的"items",通常是各种容器对象的内容。
JavaScript 不区分这两个东西,但是 Python 区分。 []
用于访问列表或字典中的数据是正确的。例如,.
用于访问 list.append
和 dict.update
等方法。它还用于访问其他类型对象的其他数据;例如,已编译的正则表达式对象有一个包含正则表达式模式的 pattern
属性(您可以使用 rx.pattern
访问它)。
一般来说,惯例是 []
用于 "open-ended" 数据存储,在这种情况下,您无法提前知道对象将保存多少数据或数据类型; .
更常用于对象具有 "by nature" 且使用预定义名称访问的特定数据。例如,仅仅知道列表中的某物并不能告诉你它里面有什么(你使用 []
),但它确实告诉你你可以追加到它(并访问你使用的追加方法.
).
Python 和 JavaScript 在这方面的另一个主要区别是在 Python 中,.
和 []
的行为都可以是由对象定制。所以 obj.foo
或 obj[foo]
可能会做一些特殊的事情,如果 obj
是一个为它们定义自己行为的对象。有各种自定义类型将其用于自己的目的。
点运算符用于访问任何对象的属性。例如复数
>>> 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__()
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
.
的条目
我来自 Javascript 背景(可以通过 .
和 []
表示法访问属性),所以请原谅我,但到底有什么区别两者之间 Python?
根据我的实验,似乎应该始终使用 []
,既可以获取 list
或 set
的索引,也可以从某个键中获取值dictionary
。这是否正确,如果不正确,您什么时候在 Python 中使用 .
?
[]
是容器的索引,例如列表或字典。
.
是对象和模块的成员。它可以是方法、成员数据或属性。
>>> xs = [1, 7, 3, 4, 5, 4, 3, 4, 1]
>>> xs.count(4)
3
>>> xs[1]
7
.
用于访问属性(包括方法)。 []
用于访问所谓的"items",通常是各种容器对象的内容。
JavaScript 不区分这两个东西,但是 Python 区分。 []
用于访问列表或字典中的数据是正确的。例如,.
用于访问 list.append
和 dict.update
等方法。它还用于访问其他类型对象的其他数据;例如,已编译的正则表达式对象有一个包含正则表达式模式的 pattern
属性(您可以使用 rx.pattern
访问它)。
一般来说,惯例是 []
用于 "open-ended" 数据存储,在这种情况下,您无法提前知道对象将保存多少数据或数据类型; .
更常用于对象具有 "by nature" 且使用预定义名称访问的特定数据。例如,仅仅知道列表中的某物并不能告诉你它里面有什么(你使用 []
),但它确实告诉你你可以追加到它(并访问你使用的追加方法.
).
Python 和 JavaScript 在这方面的另一个主要区别是在 Python 中,.
和 []
的行为都可以是由对象定制。所以 obj.foo
或 obj[foo]
可能会做一些特殊的事情,如果 obj
是一个为它们定义自己行为的对象。有各种自定义类型将其用于自己的目的。
点运算符用于访问任何对象的属性。例如复数
>>> 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__()
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
.