2016-04-21 97 views
1

當我在我公司的Python項目執行測試腳本的另一個UnboundLocalError,我得到了一個錯誤如下:在Python2.7

UnboundLocalError: local variable 'a' referenced before assignment 

我寫了一些簡單的代碼來重現問題,它有2個文件。

vars.py文件:

#!/usr/bin/env python 
a = 'aaa' 

script.py文件:

#!/usr/bin/env python 
from vars import * 


def myFunc1(): 
    print a 

    if False: 
     a = '111' 

    print a 

myFunc1() 

執行代碼:

$ python --version 
Python 2.7.10 
$ python script.py 
Traceback (most recent call last): 
    File "script.py", line 13, in <module> 
    myFunc1() 
    File "script.py", line 6, in myFunc1 
    print a 
UnboundLocalError: local variable 'a' referenced before assignment 
$ 

我GOOGLE了UnboundLocalError,發現一些有用的信息,如:

UnboundLocalError: local variable 'L' referenced before assignment Python

UnboundLocalError in Python

根據以上2個問題的答案,如果我在script.py文件中添加了def myFunc1():global a後,該錯誤消失。

我不明白的是從myFunc1去除if條件也使它發揮作用的事情...

+0

的Python在編譯time_ _statically決定局部變量。無論何時在函數的任何位置有一個賦值變量,該變量在_whole函數body_中被認爲是本地的,包括第一個'print'語句。 –

回答

1

分配到一個名稱,使名稱的局部變量,這意味着你不能分配給非本地變量無需額外的語法。在您的代碼:

from vars import * 

def myFunc1(): 
    print a   # the local variable `a` is used before it is created 
    if False: 
     a = '111' # this creates a local variable `a` 
    print a 

加入global amyFunc1第一行會告訴Python的,當它看到一個分配a它不應該創建一個局部變量。它幾乎肯定不會達到你期望的效果(假設你預計的a被改變..)。 from vars import *vars中創建名稱的本地「副本」,並且使用global語句僅表示您正在爲分配此模塊的a變量。導入vars的其他模塊將看不到分配。

刪除if語句也會刪除賦值,這就是爲什麼消除了該錯誤。

據我所知,瓦爾導入*和在 vars.py使用變量是不是一個很好的設計,但我可以不通過所有需要的變量 以來該功能可以使用功能20+在公司的項目

不寒而慄從 vars.py變量..請重構。

對於這個特定的問題,您應該使用這種模式:

import vars 

def myFunc1(): 
    print vars.a 
    if False: 
     vars.a = '111' 
    print vars.a 
+0

感謝thebjorn的答案!你是對的!如果我使用'global a',執行分配時只會在'myFunc1'中更改'a'變量。如果我使用'vars.a','myFunc1'調用後'a'變量被改變。你已經解決了我的問題,再次感謝!附:該公司的項目用於UI測試,而vars.py存儲許多常見的UI元素名稱。通常我們不應該改變vars.py中的變量,但是在Linux上,一些UI元素名稱的改變取決於它們的內容。 :( –

0

你應該是值傳遞給函數,而不是依賴於全局變量。另外如果False沒有做任何事情,因爲它總是會返回True。您可能意味着如果變量說:

#!/usr/bin/env python 
from vars import * 


def myFunc1(x): 
    print x 

    if x: 
     x = '111' 

    print x 

myFunc1(a) 
+1

感謝您的回答!這只是一個示例代碼,公司項目中需要'if'條件語句。我公司項目中的script.py被設計爲在Windows和Linux上運行。將'if False:'語句更改爲'如果不是onWindows():'更合理。當我在Windows上運行腳本時,'if'中的語句不會執行。 –

+0

我知道'from vars import *'和在vars.py中使用變量不是一個好的設計......但是我無法將所有需要的變量傳遞給該函數,因爲該函數可能會使用來自變量的20多個變量。 py在公司的項目中... –