Python中的局部赋值可能意外隐藏全局变量

示例代码:

arrGlobalArray = []
 
def AddItemToGlobalArray(objItem) :
    arrGlobalArray.append(objItem)
#End Sub
 
def TestLoop() :
    print("Entered TestLoop()")
 
    nLoopCount = 5
    for i in range(0, nLoopCount) :
        print(f"Loop {i+1}/{nLoopCount}:")
        # This creates a local array named "arrGlobalArray"
        arrGlobalArray = []
        AddItemToGlobalArray(245)
        print(f"arrGlobalArray={arrGlobalArray}")
    #Next
#End Sub
 
if __name__ == "__main__" :
    TestLoop()
#End If

由于TestLoop()函数中的arrGlobalArray = []语句被解释为局部变量定义,导致全局数组arrGlobalArrayTestLoop()函数中被屏蔽。此时的输出为:

Entered TestLoop()
Loop 1/5:
arrGlobalArray=[]
Loop 2/5:
arrGlobalArray=[]
Loop 3/5:
arrGlobalArray=[]
Loop 4/5:
arrGlobalArray=[]
Loop 5/5:
arrGlobalArray=[]

修改代码:

arrGlobalArray = []
 
def AddItemToGlobalArray(objItem) :
    arrGlobalArray.append(objItem)
#End Sub
 
def TestLoop() :
    print("Entered TestLoop()")
 
    nLoopCount = 5
    for i in range(0, nLoopCount) :
        print(f"Loop {i+1}/{nLoopCount}:")
        # This won't create local array
        arrGlobalArray.clear()
        AddItemToGlobalArray(245)
        print(f"arrGlobalArray={arrGlobalArray}")
    #Next
#End Sub
 
if __name__ == "__main__" :
    TestLoop()
#End If

此时输出正确:

Entered TestLoop()
Loop 1/5:
arrGlobalArray=[245]
Loop 2/5:
arrGlobalArray=[245]
Loop 3/5:
arrGlobalArray=[245]
Loop 4/5:
arrGlobalArray=[245]
Loop 5/5:
arrGlobalArray=[245]
it
除非特别注明,本页内容采用以下授权方式: Creative Commons Attribution-ShareAlike 3.0 License