[英]Best way to define multiple list variables inside class in 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.