2013-12-08 47 views
0

這是我的課:名單的意外變化值

class variable(object): 
    def __init__(self, name, name_alias, parents,values,table): 
    #name of the variable 
    self.name = "" 

這是有問題的功能:

f是一個文件.txt文件(在 「主要功能」 打開)

def read_problem(f): 
    list_of_variables=[] 
    entry=0; 

    for line in f: 
     words = line.split() 

     #enters only if it's not a comment 
     if (words[0]!='#'): 

      if (words[0]=="VAR"): 
       x=variable; 
      elif (words[0]=="name"): 
       x.name=words[1] 
       list_of_variables.append(x) 

    for i in range(len(list_of_variables)): 
     print(list_of_variables[i].name) 
    return 

我的.txt文件是:

VAR 
name MaryCalls 
VAR 
name JohnCalls 
VAR 
name Burglary 
VAR 
name Earthquake 
VAR 
name Alarm 

我得到了在打印(因此,清單)是:

報警

報警

報警

報警

報警

但我想有:

MaryCalls

JohnCalls

防盜

地震

報警

有什麼不對?爲什麼列表的所有以前的條目都在改變?

謝謝!

回答

4

x=variable使得x參考類別variable。您從不創建該類的任何實例,而是反覆修改類級變量name

在程序結束時,當您打印時,variable.name當然有最後一個值分配給它,在這種情況下,'Alarm'

你會看到這一點,如果你這樣做print(list_of_variables)

[<class '__main__.variable'>, <class '__main__.variable'>, 

變化x = variablex = variable(),你會看到(例如):

[<__main__.variable object at 0x6ffffee65d0>, <__main__.variable object at 0x6ffffee6610> 

等。

2

1)如果你想初始化con中的名字在variable的結構體中,您必須進一步縮進任務。

def __init__(self, name, name_alias, parents,values,table): 
    #name of the variable 
    self.name = "" 

2)你的主要問題是,你要創建的variable一個新的實例與此行:

x=variable; 

你必須寫:

x = variable(); 
0

主要問題是代碼檢測到以「VAR」開頭的行時,它將類變量賦值給x,而不是該類的一個實例。要做到這一點,你需要調用最終調用類'__init__()方法的類,如果它有一個。你的確如此,但它預計有5個參數,其中沒有一個是在創建時已知的。

在這種情況下最簡單的做法是爲每個參數分配一個默認值,意思是「還沒有值」,並將其分配給正在創建的實例(self)。

這裏就是我的意思是:

class Variable(object): 
    def __init__(self, name="", name_alias="", parents=None, values=None, 
       table=None): 
     self.name = name 
     self.name_alias = name_alias 
     self.parents = parents 
     self.values = values 
     self.table = table 

def read_problem(f): 
    list_of_Variables=[] 

    for line in f: 
     words = line.split() 

     # if not a comment 
     if words[0] != '#': 
      if words[0] == "VAR": 
       x = Variable() # construct empty Variable 
      elif words[0] == "name": 
       x.name = words[1] 
       list_of_Variables.append(x) 

    for var in list_of_Variables: 
     print(var.name) 
    return 

def main(): 
    filename = 'variables.txt' 
    with open(filename) as f: 
     read_problem(f) 

main()