簡體   English   中英

類中的Python變量列表

[英]Python list of variables inside a class

這是我的第一個問題,再加上我是個菜鳥,請隨時告訴我是否有完全不同的方式來解決這個問題!

無論如何,我正在構建一個程序,該程序涉及在Python 2.7中使用四色定理為地圖着色,並嘗試盡可能多地使用某些顏色,並且在運行類似以下代碼的代碼時遇到問題:

在一個模塊中:

class state:
    a = 0
    b = 0
    variable_list = [a,b]

然后,將該模塊導入到主程序中:

from State import state  //State(uppercase "s") is the .py file with the state class in it

instance = state()

instance.a = 1

print instance.variable_list[0]

...盡管該程序在主程序中進行了更改,但該程序仍打印0。 關於如何通過更改來更新instance.variable_list的任何想法?

您必須根據指針來考慮Python變量。 您的問題實際上可以歸結為以下幾點:

>>> a = 42
>>> l = [a]
>>> a = 0
>>> print l[0]  # shouldn't this print 0?
42

答案是否定的,因為重新分配a與列表l無關。 該列表包含指向內存中某些對象的指針。 l[0]恰好指向與a (int 42 )相同的對象。 當我們重新分配a ,我們只是簡單地讓它“指向”內存中的一個新對象(int 0 )。 這與列表l無關。

看起來像這樣:

a = 42
l = [a]

                      +----+
            a  -----> | 42 | <------ l[0]
                      +----+

a = 0

                      +----+
            l[0] ---> | 42 |
                      +----+

                      +---+
            a ------> | 0 |
                      +---+

請注意, l[0]尚未更改。

我會簡化為我想您想做的

class State(object):
    def __init__(self):
        self.a = 0
        self.b = 0
    @property
    def variable_list(self):
        return self.a, self.b

和用法:

state = State()

state.a = 1

state.variable_list
Out[23]: (1, 0)

您的代碼有顯着變化:

  • 您要獲取State的實例,因此使屬性成為實例屬性,而不是類屬性。 我懷疑您是否希望State每個實例共享相同的屬性。
  • @property裝飾器使之成為可能,因此您可以像訪問常規variable_list一樣訪問variable_list ,但是可以自定義其返回值的行為-在這種情況下,是幾個實例屬性。
  • object繼承以獲得“新樣式”類。 相信我,現在基本上沒有理由使用老式類了。
  • 命名約定。 類以大寫字母開頭。

當您更新變量a它不會更新該實例,而只是為其分配具有完全不同的指針的另一個int。 因此,此更改不會像您期望的那樣反映列表中的更改。

您可以在列表中添加執行以下操作的update方法:

def update():
    variable_list = [a,b]

並在每次更新變量時調用它。

或者,您可以簡單地使用字典並刪除單個變量:

class state:
    variables = {'a': 0, 'b': 1}

x = state()
print x.variables['a']

x.variables['a'] = 1
print x.variables['a']

[OUTPUT]
0
1

讓我們看一下您的類代碼。

class state:
    a = 0
    b = 0
    variable_list = [a,b]

a變為0,b變為0。因此,列表“ variable_list”變為[0,0]。 然后,您可以使用以下代碼更改:

instance.a = 1

哪個有效。 對象實例中的變量確實為1。但是,variable_list仍為[0,0]! 該列表保持其原始值,因為列表本身未更改。 您為生成列表而運行的代碼僅運行了一次。 為了解決這個問題,您可以使函數根據a和b的當前值(而不是原始值)來更新variable_list。 例如,您可以創建一個函數來更新變量列表,如下所示:

def updateVariableList(self):
    variable_list = [self.a, self.b]

當您使用instance.updateVariableList()調用該函數時,它將基於a和b的當前值更新列表的值。 現在打印instance.variable_list [0]將顯示更新的值。

暫無
暫無

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

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