簡體   English   中英

Python:設置屬於導入模塊名稱空間的變量

[英]Python: setting variables that belong to the namespace of an imported module

說我有一個模塊params.py ,其中聲明了一堆變量:

a = 0.2
b = 0.4
...

在使用此模塊時,我想使用*導入其命名空間,以便於引用。 但是在那種情況下,我似乎只能訪問參數的值,但無法重置它們:

from params import *
def test1():
    print(a)  #this works: printing out the value of params.a

def test2():
    a= 0.5  #doesn't work: does not change the value of params.a 

嘗試將變量引用為params.a = 0.5也不起作用(給出NameError,因為未定義“ params”)

我的問題:如何設置/重置以這種方式導入的變量的值?

test2()范圍內分配a = 0.5僅對該函數本地。

您要做的是在模塊上設置屬性。

例:

import params

def test1():
    print(params.a)

def test2():
    params.a = 0.5

請參閱: Python范圍規則的簡短描述

注意:認識到Python中的幾乎所有東西都是某種對象,通常都具有屬性,這可能會有所幫助。 這包括模塊,類,類的實例,函數等。

更新:不鼓勵這樣做將“完全”執行您的預期:

foo.py:

from params import *  # noqa


def test1():
    print(a)


def test2():
    global a

    a = 0.5

params.py:

a = 1

演示:

$ python -i foo.py
>>> test1()
1
>>> test2()
>>> test1()
0.5
>>>

更新II:但是我也要指出,正如我的評論中所述,這實際上並沒有改變params.a參考。 看到:

$ python -i foo.py
>>> id(params.a)
140602494749016
>>> id(a)
140602494749016
>>> test1()
1
>>> test2()
>>> test1()
0.5
>>> id(params.a)
140602494749016
>>> id(a)
140602494760472
>>>

摘要:請一般使用此處介紹的第一個選項。

好吧,對我來說,最簡單的解決方案是為同一模塊提供2條import語句:

from params import *
import params

第一條語句使我可以訪問變量的值,而不必以"params."為前綴"params." ,第二個允許我在需要時重新綁定變量

params.a = 0.5

我不知道這是否符合最佳做法(可能不符合)。 據我所知,它確實可以完成工作。 歡迎其他建議。

編輯:這不起作用,因為值a不會反映更新的價值:

print(a)  #say it prints 0.2
params.a = 0.5
print(a) # will still print 0.2
print(params.a) #will print 0.5

因此,這里的教訓是,如果使用from params import a變量,那么即使原來的變量發生a變化,您也會from params import a的值。 即它是按值而不是按引用的導入。

暫無
暫無

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

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