Quale meccanismo di passaggio degli argomenti utilizza Python e dove è documentato ufficialmente?

4

Per quanto ne sappia, python viene generalmente chiamato "call-by-sharing", ma lo implementa con call-by-value (come Java) o call-by-reference? o qualcos'altro? Gradirei se questo potesse essere risolto con la documentazione ufficiale di Python (in cui non riesco a trovare la risposta) rispetto a qualsiasi cosa soggettiva.

    
posta Tim Atkinson 01.12.2014 - 05:57
fonte

4 risposte

6

In termini di documentazione ufficiale, per Domande frequenti sulla programmazione :

Remember that arguments are passed by assignment in Python.

Altrove nei documenti :

The actual parameters (arguments) to a function call are introduced in the local symbol table of the called function when it is called; thus, arguments are passed using call by value (where the value is always an object reference, not the value of the object).

dove la nota a piè di pagina aggiunge:

Actually, call by object reference would be a better description, since if a mutable object is passed, the caller will see any changes the callee makes to it (items inserted into a list).

Questo è coerente con il resto del modello di assegnazione di Python, ad esempio:

def somefunc(y):
    y.append(1)

x = [0]
somefunc(x)
print x

è simile a:

x = [0]
y = x
y.append(1)
print x

in quanto l'oggetto assegnato al nome x è anche assegnato al nome y (anche se solo entro somefunc nel primo).

    
risposta data 01.12.2014 - 16:29
fonte
10

Puoi chiedere a Python se stessa:

def is_python_pass_by_value(foo):
    foo.append('More precisely, for reference types, it is call-by-object-sharing.')
    foo = ['Python is pass-by-reference.']

quux = ['Yes, of course, Python *is* pass-by-value!']

is_python_pass_by_value(quux)

print(quux)
# ['Yes, of course, Python *is* pass-by-value!', 'More precisely, for reference types, it is call-by-object-sharing.']

Call-by-sharing è semplicemente un caso speciale di pass-by-value, in cui il valore che viene passato è un puntatore implicito allo stato condiviso (non necessariamente mutevole).

    
risposta data 01.12.2014 - 09:35
fonte
0

La semantica del passaggio e dell'assegnazione è esattamente la stessa in Python come in Java. Java è descritto su StackExchange e altrove su Internet (così come da te nella tua domanda) come valore pass-by, e questi termini devono essere usati in modo coerente in tutte le lingue per essere significativi; quindi, Python è solo valore per passata .

    
risposta data 01.12.2014 - 11:24
fonte
0

Dimentica call-by-whathaveyou per Python

Lo scoping dei pitoni e il passaggio dei parametri sono abbastanza semplici se non provi a comprenderli con questi termini call-by-X semi-definiti.

  • Un parametro formale (di una funzione) è un nome.
  • Cosa passi come argomento della funzione rappresenta un oggetto.
  • Nel corpo della funzione, l'oggetto sarà associato a quel nome durante l'esecuzione della funzione.
  • Alcuni oggetti sono mutabili (ad es. elenchi, oggetti di classe), altri non lo sono (ad esempio stringhe, numeri interi).

Questo è tutto quello che c'è.

Associare un oggetto a un nome (o un nome a un oggetto, è lo stesso) è esattamente ciò che fa l'incarico: a = 1 legherà l'oggetto 1 al nome a e a = b legherà l'oggetto-che-il-nome-b-è-attualmente-legato-al nome a .

Dopo def myfunc(a) , la chiamata myfunc(b) legherà il nome a proprio come a = b , eccetto che l'oggetto a cui fa riferimento b viene anche portato nello scope corretto: il corpo di myfunc .

Vedi la sezione di riferimento del linguaggio Python 4.1 Denominazione e associazione .

    
risposta data 02.12.2014 - 17:44
fonte

Leggi altre domande sui tag