簡體   English   中英

在Python中將列表定義為全局變量

[英]Defining lists as global variables in Python

我正在使用一個列表,其中一些函數在我的程序中工作。 這實際上是一個共享列表,我的所有功能都可以編輯它。 是否真的有必要在所有功能中將其定義為“全局”?

我的意思是將global關鍵字放在每個使用它的函數中,或者在不使用其定義背后的全局字的情況下在所有函數之外定義它是否足夠?

分配變量( x = ... )時,您將在當前范圍中創建變量(例如,當前函數的本地變量)。 如果它碰巧在外部(例如全局)范圍內影響變量,那么太糟糕了 - Python並不關心(這是一件好事)。 所以你不能這樣做:

x = 0
def f():
    x = 1
f()
print x #=>0

期待1 相反,您需要聲明您打算使用global x

x = 0
def f():
    global x
    x = 1
f()
print x #=>1

但請注意,變量的賦值與方法調用非常不同。 您總是可以在范圍內調用任何方法 - 例如,來自外部(例如全局)范圍的變量,因為沒有任何局部陰影它們。

同樣非常重要的是:成員賦值( x.name = ... ),項目賦值( collection[key] = ... ),切片賦值( sliceable[start:end] = ... )以及更多可能是所有方法調用還有! 因此,您不需要global來更改全局成員或調用它的方法(即使它們改變了對象)。

是的,如果你打算寫它,你需要使用global foo

foo = []

def bar():
    global foo
    ...
    foo = [1]

不,您可以將列表指定為函數的關鍵字參數。

alist = []
def fn(alist=alist):
    alist.append(1)
fn()
print alist    # [1]

我會說這是不好的做法。 有點太hackish。 如果你真的需要使用全局可用的類似單例的數據結構,我會使用模塊級變量方法,即將'alist'放在模塊中,然后在其他模塊中導入該變量:

在文件foomodule.py中:

alist = []

在文件barmodule.py中:

import foomodule
def fn():
    foomodule.alist.append(1)
print foomodule.alist    # [1]

暫無
暫無

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

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