2017-06-14 1 views
1

In bash habe ich eine Datei "function.sh ":Wie wird eine importierte Funktion in einer Schleife mit der Schleifenvariablen innerhalb dieser Funktion verwendet?

_bash_function_() { 
echo $i 
    } 

und eine Datei" exec.sh"

#!/bin/bash 

. ./function.sh 

range=(1 2 3) 

for i in ${range[@]}; do 
    _bash_function_ 
done 

, dass der Ausgang gibt:

1 
2 
3 

In Python ich eine Datei haben "function.py":

def py_function(): 
    print (i) 

Und eine Datei "exec.py":

#!/opt/local/bin/python3 

from function import * 

list = ['1','2','3'] 

for i in list: 
    py_function() 

dies ein Fehler gibt:

NameError: name 'i' is not defined 

Allerdings, wenn ich die Funktion und die Schleife in der gleichen Datei haben:

#!/opt/local/bin/python3 

def py_function(): 
    print (i) 

list = ['1','2','3'] 

for i in list: 
    py_function() 

Der Ausgang ist:

1 
2 
3 

Wie kann ich diese Ausgabe in Python haben, mit der Funktion in einer Datei, und die Schleife in der anderen?

+1

Es gibt einige wichtige Unterschiede zwischen 'bash' und Python hier. Erstens sind 'bash'-Variablen wirklich globale Variablen, da Sie nicht wirklich Module haben; 'source' führt den Code * genau * so aus, als ob er in der aktuellen Datei enthalten wäre. In "py_function" bezieht sich "i" auf "function.i", nicht auf die distinkte Variable "exec.i" (oder "__main __. I", abhängig davon, wie die Datei ausgeführt wird). Zweitens (und nicht sofort relevant hier) verwendet 'bash' dynamisches Scoping, was bedeutet, dass eine nicht lokale Variable den Bereich referenziert, in dem die Funktion * genannt * ist, nicht wo sie * definiert * ist. Python verwendet das statische Scoping. – chepner

Antwort

3

Einer der Hauptpunkte von Funktionen ist, dass sie Argumente akzeptieren. In Ihrem Fall sollten Sie die Funktion definieren, so dass es i als Argument akzeptiert:

def py_function(i): 
    print (i) 

und übergeben Sie es, wenn Sie es nennen:

for i in list: 
    py_function(i) 
+0

Ich sehe, das funktioniert. Vielen Dank ! :) – azbc

Verwandte Themen