2015-05-15 11 views
16

Provengo da uno sfondo Javascript (dove è possibile accedere alle proprietà tramite la notazione . e []), quindi, per favore, perdonami, ma quale, esattamente, è la differenza tra i due in Python?Qual è la differenza tra la parentesi quadra e le notazioni punto in Python?

Dalla mia sperimentazione è seeems che [] dovrebbe sempre essere utilizzato, sia per ottenere l'indice di un list o set e per ottenere il valore di una certa chiave in una dictionary. È corretto, e, in caso negativo, quando usi un . in Python?

+0

(Sostanzialmente) usare '[]' per accedere agli indici e creare liste. Usare '.' per accedere ai metodi dell'oggetto – RafaelC

+0

@RafaelCardoso:' .' è per gli attributi in generale, non solo per i metodi. – Olaf

risposta

15

L'operatore punto viene utilizzato per accedere agli attributi di qualsiasi oggetto.Ad esempio, un numero complesso

>>> c = 3+4j 

trovi (tra gli altri) i due attributi real e imag:

>>> c.real 
3.0 
>>> c.imag 
4.0 

così come quelli, ha un metodo, conjugate(), che è anche un attributo:

>>> c.conjugate 
<built-in method conjugate of complex object at 0x7f4422d73050> 
>>> c.conjugate() 
(3-4j) 

Piazza notazione staffa viene utilizzata per l'accesso a membri di una raccolta, se questo è a chiave, nel caso di un dizionario o OTH er mappatura:

>>> d = {'a': 1, 'b': 2} 
>>> d['a'] 
1 

... o per indice, nel caso di una sequenza come una lista o una stringa:

>>> s = ['x', 'y', 'z'] 
>>> s[2] 
'z' 
>>> t = 'Kapow!' 
>>> t[3] 
'o' 

Queste raccolte anche, separatamente, hanno attributi:

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

... e ancora, nei casi precedenti, questi attributi sono metodi.

Mentre tutti gli oggetti hanno alcuni attributi, non tutti gli oggetti hanno membri. Per esempio, se si cerca di utilizzare la notazione parentesi quadra per accedere a un membro del nostro numero complesso c:

>>> c[0] 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: 'complex' object is not subscriptable 

... otteniamo un errore (che ha senso, dal momento che non c'è modo ovvio per un numero complesso per avere membri).

È possibile definire come [] e . lavoro accesso in una classe definita dall'utente, utilizzando __getitem__() e __getattr__() rispettivamente i metodi speciali. Spiegare come farlo va oltre lo scopo di questa domanda, ma puoi leggere di più a riguardo nello Python Tutorial.

+1

Inoltre, vale la pena notare che è possibile sovrascrivere il comportamento di questi operatori nelle classi definite dall'utente implementando il ['__getitem__'] (https://docs.python.org/2/reference/datamodel.html#object.__getitem__) (per '[]') e ['__getattr__'] (https://docs.python.org/2/reference/datamodel.html#object.__getattr__) (per' .') metodi. – augurar

+0

@augurar buon punto; Ho aggiunto un breve paragrafo su questo. –

+0

Dai documenti: [Riferimenti attributo] (https://docs.python.org/3/reference/expressions.html#attribute-references) e [Iscrizioni] (https://docs.python.org/3/reference /expressions.html#subscriptions) – wwii

3

[] è l'indice di un contenitore, ad esempio un elenco o un dizionario.

. è il membro di un oggetto e moduli. Può essere un metodo, dati membro o attributo.

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

>>> xs.count(4) 
3 

>>> xs[1] 
7 
4

. viene utilizzato per accedere agli attributi (compresi i metodi). [] viene utilizzato per accedere a quelli che vengono chiamati "articoli", che di solito sono i contenuti di vari tipi di oggetti contenitore.

JavaScript non distingue queste due cose, ma Python lo fa. Sei corretto che [] viene utilizzato per accedere ai dati in un elenco o dettato. . viene utilizzato, ad esempio, per accedere a metodi come list.append e dict.update. Viene anche utilizzato per accedere ad altri dati su altri tipi di oggetti; per esempio, gli oggetti di espressione regolare compilati hanno un attributo pattern che tiene il modello regex (lo si accederà con rx.pattern).

In generale, la convenzione è che [] viene utilizzato per la memorizzazione di dati "aperti" in cui non si conosce in anticipo quanti o quali tipi di dati l'oggetto sarà trattenuto; . è più comunemente utilizzato per dati specifici che l'oggetto ha "per natura" e a cui si accede con un nome predefinito. Ad esempio, solo sapendo che qualcosa come una lista non ti dice cosa c'è dentro (per il quale usi []), ma ti dice che puoi accodarlo (e per accedere al metodo append usi .).

L'altra grande differenza tra Python e JavaScript a questo proposito è che in Python, il comportamento di entrambi gli apparecchi . e [] può essere personalizzato dall'oggetto. Quindi obj.foo o obj[foo] possono fare qualcosa di speciale se obj è un oggetto che definisce il proprio comportamento per loro. Esistono vari tipi personalizzati che fanno uso di questo per i propri scopi.

0

In realtà, Python utilizza le parentesi quadre per racchiudere una chiave. Per gli elenchi, questo è un indice intero (senza segno) o una porzione, mentre per i dicts questo è un oggetto (hasable) come stringa, tupla, ecc. O anche un intero (singolo e senza segno). Questo è diretto a molte altre lingue che usano una sintassi simile o addirittura identica.

Il viene utilizzato per accedere ai membri di un oggetto, in modo molto simile a C++, C, Java, JavaScript, ecc. Sarebbe abbastanza semplice scrivere una classe dizionario che consente di utilizzare la sintassi del punto per accedere ai suoi elementi . Tuttavia, per questo, le chiavi devono essere validi identificatore Python (letter { letter | digit | _ }. Tuttavia, questo non è molto comune.

Un set non supporta l'indicizzazione, poiché non è ordinato internamente e non esiste una relazione tra "chiave" e "valore". Per un elenco, non "ottieni l'indice", ma "ottieni il valore per un indice". Per un ditt questo è simile, ma "l'indice" è più flessibile. Tuttavia, il dict non consente l'affettatura ed è (come il set) non ordinato.

Sidenote: Python utilizza un dettato interno per un oggetto per organizzare i suoi membri. Basta provare sulla console:

class MyClass: 
    def myfunc(self): 
     pass 

print(MyClass.__dict__) 

Otterrai tutti gli attributi (nome: valore) di questa classe.Annotare la voce per myfunc.

Problemi correlati