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

izkcnapc  于 2022-12-17  发布在  Python
关注(0)|答案(4)|浏览(152)

我来自Javascript背景(其中属性可以通过.[]表示法访问),所以请原谅我,但在Python中,两者之间的区别到底是什么?
从我的实验中可以看出,[]应该总是被使用,既可以用来获取listset的索引,也可以用来获取dictionary中某个键的值。这是正确的吗?如果不是,在Python中什么时候使用.

m2xkgtsf

m2xkgtsf1#

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

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

方括号表示法用于访问集合的成员,无论是字典中的键还是其他Map:

>>> 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教程中阅读更多相关内容。

tez616oj

tez616oj2#

.用于访问属性(包括方法)。[]用于访问所谓的“项”,其通常是各种容器对象的内容。
JavaScript并不区分这两件事,但是Python区分了,[]用于访问列表或指令中的数据是正确的,例如,.用于访问list.appenddict.update等方法,它也用于访问其他类型的对象上的其他数据;例如,编译后的正则表达式对象有一个保存regex模式的pattern属性(您可以使用rx.pattern访问它)。
一般来说,约定是[]用于“开放式”数据存储,在这种情况下,您事先不知道对象将保存多少数据或什么类型的数据; .更常用于对象“天生”具有的特定数据,并且可以通过预定义的名称访问这些数据。例如,仅仅知道某个列表并不能告诉您其中包含了什么(您可以使用[]),但它可以告诉您可以向其追加内容(要访问append方法,您可以使用.)。
Python和JavaScript在这方面的另一个主要区别是,在Python中,.[]的行为都可以由对象自定义。因此,如果obj是一个为它们定义自己行为的对象,obj.fooobj[foo]可能会做一些特殊的事情。有各种自定义类型可以利用这一点来达到自己的目的。

91zkwejq

91zkwejq3#

[]是容器的索引,例如列表或字典。
.是对象和模块的成员。它可以是方法、成员数据或属性。

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

>>> xs.count(4)
3

>>> xs[1]
7
yqlxgs2m

yqlxgs2m4#

实际上,Python使用方括号来括起键,对于列表,这是一个整型(无符号)索引或切片,而对于字典,这是一个(可具有的)对象,如字符串、元组等,甚至是一个整型(单值和无符号),这与许多其他使用类似或相同语法的语言是直接了当的。
.用于访问对象的成员,与C++、C、Java、JavaScript等非常相似。编写一个允许使用点语法访问其元素的字典类非常简单。然而,为此,键必须是有效的Python标识符(letter { letter | digit | _ }。然而,这并不常见。
集合不支持索引,因为它不是内部排序的,并且“键”和“值”之间没有关系。对于列表,你不需要“获取索引”,但是你需要“获取索引的值”。对于dict,这是类似的,但是“索引”更灵活。但是,dict不允许切片,并且(像集合一样)是无序的。
旁注:Python使用一个对象的内部dict来组织它的成员。

class MyClass:
    def myfunc(self):
        pass

print(MyClass.__dict__)

你将得到这个类的所有属性(name:value),注意myfunc的条目。

相关问题