2017-01-28 117 views
0

我是一個Python和一般編程noob。只編程了大約2周。我有關於Python中的函數的快速問題。 有人能解釋爲什麼這個工程:功能問題內的函數

import random 
valuea = valueb = valuec = "0" 
stationary = "X" 
def func1(): 
    print("",valuea,"\n",valueb,"\n",valuec) 
    return 
random.seed(0) 
random_list = ("valuea","valueb","valuec") 
random_result = random.choice(random_list) 
locals()[random_result] = stationary 
func1() 

結果:

0 
X 
0 

但是這一點,但是,不工作:

def func1(): 
    import random 
    valuea = valueb = valuec = "0" 
    stationary = "X" 
    def func2(): 
     print("",valuea,"\n",valueb,"\n",valuec) 
     return 
    random.seed(0) 
    random_list = ("valuea","valueb","valuec") 
    random_result = random.choice(random_list) 
    locals()[random_result] = stationary 
    func2() 
    return 
func1() 

結果:

0 
0 
0 

有沒有辦法給媽媽它在第二種情況下工作,在功能內部依賴?

回答

0

讓我們看一個更簡單的例子:

def func1(): 
    a = 0 
    def func2(): 
     print(a) 
    locals()['a'] = 1 
    print(a) 
    func2() 

func1() 
print(a) 

此輸出

0 
0 
1 

即變量a本地兩種功能不被修改。查看locals的文檔,可以發現「......更改可能不會影響解釋器使用的本地和自由變量的值。」因此用它來改變局部變量可能會或可能無法正常工作的價值...

相反我建議使用字典,如果你想要將其值與名稱關聯:

def func1(): 
    d = {'a' : 0} 
    def func2(): 
     print(d['a']) 
    d['a'] = 1 
    print(d['a']) 
    func2() 

func1() 
print(d['a']) 

這導致了以下的輸出:

1 
1 
Traceback (most recent call last): 
    File "...", line 10, in <module> 
    print(d['a']) 
NameError: name 'd' is not defined 

造成最後一行是個例外,因爲d正確的行爲只在func1定義。因此無法在func1範圍之外訪問。

您可以閱讀更多關於範圍例如here

+0

非常感謝!再次:) – IrvinLesh

+0

Np - 無論如何,這可能是我的錯,因爲它首先向你展示了當地人的東西。從一開始就向你展示列表變體會更好。 –