Stavo scrivendo una piccola utility di file in precedenza e ho riscontrato un problema con il passaggio per riferimento. Dopo aver letto How do I pass a variable by reference?, ho impostato la variabile che volevo passare come argomento e anche come valore di ritorno. Entro il codice qui sotto, è la linea:Modo Pythonic per mantenere l'assegnazione variabile
diff = compareDir(path0, path0List, path1, path1List, diff)
dove diff è la variabile volevo passare per riferimento.
Mentre funziona, sembra piuttosto imbarazzante. Penso che ci debba essere un modo migliore. In molte altre lingue, potrei semplicemente impostare compareLists()
per non avere alcun valore di ritorno e usare l'effetto collaterale della modifica dell'argomento pass-by-reference. Il pass-by-assignment di Python sembra non consentire questo.
Sono relativamente nuovo a Python e vorrei sapere se esiste un modo più pitioso per risolvere il problema. Richiederebbe ripensare completamente le funzioni? O c'è una bella affermazione di cui non sono a conoscenza? Mi piacerebbe stare lontano dalle variabili globali.
Accolgo qualsiasi critica e commento costruttivo. Grazie!
Codice Rilevante:
def comparePaths(path0, path1):
path0List = os.listdir(path0)
path1List = os.listdir(path1)
diff = False
diff = compareDir(path0, path0List, path1, path1List, diff)
print()
diff = compareDir(path1, path1List, path0, path0List, diff)
return diff
def compareDir(basePath, baseList, comparePath, compareDir, diffVar):
for entry in baseList:
#compare to the other folder
if (not (entry in compareDir)):
if (not (diffVar)):
diffVar = True
print ("Discreptancies found. The following files are different:")
print (str(entry) + " doesn\'t exist in " + str(comparePath))
else:
print (str(entry) + " doesn\'t exist in " + str(comparePath))
return diffVar
Se si desidera ridurre i parametri a qualcosa in cui si chiama 'compareListe()', penso che potrebbe essere necessario riconsiderare il proprio approccio. Forse memorizzando i tuoi valori in un dizionario perché in questo modo puoi modificare le coppie chiave/valore ovunque nello spazio dei nomi. – Dan
Grazie Dan, questo è un eccellente suggerimento. Potrei fare proprio questo. –
La risposta collegata fa un ottimo lavoro di spiegazione della distinzione tra oggetti mutevoli e immutabili. 'diff = False' è immutabile. 'diff = [False]' è mutabile. – hpaulj