2017-06-14 64 views
1

在bash我有一個文件 「function.sh 」:如何在循環中使用導入的函數,並在該函數中使用循環變量?

_bash_function_() { 
echo $i 
    } 

和文件「 exec.sh

#!/bin/bash 

. ./function.sh 

range=(1 2 3) 

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

這使輸出:

1 
2 
3 

在Python中我有一個文件「function.py」:

def py_function(): 
    print (i) 

和文件 「​​」:

#!/opt/local/bin/python3 

from function import * 

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

for i in list: 
    py_function() 

這給出了一個錯誤:

NameError: name 'i' is not defined 

但是如果我具備的功能,並在同一個文件的循環:

#!/opt/local/bin/python3 

def py_function(): 
    print (i) 

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

for i in list: 
    py_function() 

輸出:

1 
2 
3 

我怎樣才能在Python中輸出這個輸出,函數在一個文件中,而循環在另一個文件中?

+1

有bash'之間'幾個關鍵的不同Python在這裏。首先,'bash'變量是真正的全局變量,因爲你真的沒有模塊; 'source'只是簡單地執行代碼*就好像它出現在當前文件中一樣。在'py_function'中,'i'是指'function.i',而不是獨立變量'exec.i'(或'__main __。i',取決於文件如何執行)。其次(在這裏並不直接相關),'bash'使用動態作用域,這意味着一個非局部變量引用函數被調用*的範圍,而不是它被定義*的地方。 Python使用靜態範圍。 – chepner

回答

3

功能的要點之一是他們接受參數。在你的情況,你應該定義的函數,以便它接受i作爲參數:

def py_function(i): 
    print (i) 

,並通過它,當你把它叫做:

for i in list: 
    py_function(i) 
+0

我明白了,那有效。謝謝 ! :) – azbc