2014-05-02 20 views
2

這是我的第一個問題,並結合我是相當noob隨時告訴我是否有一個完全不同的方式,我應該去這個!一個類中的變量的Python列表

不管怎麼說,我建立涉及着色與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,despit在主程序中改變它。有關如何更新instance.variable_list更改的想法?

回答

0

讓我們來看看你的類代碼。

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

一個變爲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()這個函數,它會更新列表的基礎上的當前值的值和灣現在打印instance.variable_list [0]將顯示更新的值。

0

當您更新變量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 
+1

這個答案有點誤導。你不會創建一個副本(只需要打印'a'的'id()'和'variable_list [0]');相反,你只是將'instance.a'指針重定向到其他地方,與'variable_list'無關。 – arshajii

+0

@arshajii,我已經更新了我的答案。如果您覺得它還有些不足,請隨時編輯它。非常感謝你。 – sshashank124

+0

編輯是朝正確方向邁出的一步,但是聲明*「這是因爲整數是不可變的對象」*仍然不準確;這與整數的不變性無關 - 例如嘗試使用列表。 – arshajii

2

你有指針方面認​​爲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]沒有改變。

+0

感謝arshajii,這非常有幫助! (和文本的僞圖形是一個很好的接觸) – user3594632

2

我會削減到我認爲你想要要做。

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就像它是一個常規屬性,但您可以自定義它返回的行爲 - 在這種情況下,它是幾個實例屬性。
  • 繼承object得到"new-style"類。相信我,現在基本上沒有理由使用舊式的課程。
  • 命名約定。類以大寫字母開頭。
相關問題