簡體   English   中英

在 Python 3 中正確使用全局變量

[英]Correct Use Of Global Variables In Python 3

Python 3 中全局變量的正確用法是什么?:

1)在核心腳本中(不在函數內)聲明一次global VAR_NAME ,然后在其他任何地方簡單地將變量稱為VAR_NAME

2) 在每個使用全局變量的函數中聲明一次global VAR_NAME ,然后在函數的其余部分和核心腳本本身中簡單地將變量稱為VAR_NAME

在第一種情況下, global 關鍵字毫無意義,因此這是不正確的。 在模塊級別定義變量使其成為全局變量,您不需要 global 關鍵字。

第二個例子是正確的用法。

然而,全局變量最常見的用法是在任何地方都不使用 global 關鍵字。 僅當您想重新分配函數/方法中的全局變量時才需要 global 關鍵字。

如果您使用全局變量的方式會被解釋為對局部變量的賦值,則需要在函數中使用 global 關鍵字。 如果沒有 global 關鍵字,您將創建一個局部變量,在函數范圍內隱藏全局變量。

這里有一些例子:

global_var = 1

def example1():
    # global keyword is not needed, local_var will be set to 1.
    local_var = global_var

def example2():
    # global keyword is needed, if you want to set global_var,
    # otherwise you will create a local variable.
    global_var = 2

def example3():
    # Without using the global keyword, this is an error.
    # It's an attempt to reference a local variable that has not been declared.
    global_var += 1

“以其他方式被解釋為對局部變量的賦值”---是的,但這里有一個微妙的細節:

------------------- 錯誤:賦值前引用了局部變量“c”

def work():
  c += 3

c = 0

work()
print(c)

------------------- 錯誤:賦值前引用了局部變量“c”

c = 0

def work():
  c += 3

work()
print(c)

------------------- 打印 [3]

def work():
  c.append(3)

c = []

work()
print(c)

------------------- 打印 [3]

c = []

def work():
  c.append(3)

work()
print(c)

上述答案中前兩種情況和后兩種情況之間的主要區別必須是列表是可變的。 對於 a = 1 之類的情況,指針指向 1 所在的位置,當您說 a = 2 時,指針會移動。

對於可變對象的情況,分配了內存位置,並且當使用 append 等方法時,內存位置本身會發生變化,因此可變引用的值會全局更改。

現在最大的問題是函數如何知道我們正在修改的變量是全局變量還是局部變量,因為似乎我們可以修改全局變量,如果它是可變的,而如果它是非可變的,我們就不能(該函數也無法識別這一點)作為全局變量)

result = 0
def addition(x, y):
    result = x + y
    print(result)
def substraction(x, y):
    result = x - y
    print(result)
def multiplication(x, y):
    result = x * y
    print(result)
def division(x, y):
    result = x / y
    print(result)
print("result " + str(result))

這將打印0。如何使被調用函數在全局范圍內更改結果變量以獲得正確答案?

python3.8 這會返回錯誤:UnboundLocalError: local variable 'myvar' referenced before assignment

myvar = 0

def func1():
    myvar = 1
    
def func2():
    myvar += 3
  
func1()
func2()  
print('myvar: ' + str(myvar) + '<br>')

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM