列表值发生意外更改

2024-04-25 09:02:57 发布

您现在位置:Python中文网/ 问答频道 /正文

这是我的课:

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

这是有问题的函数:

f是一个file.txt文件(在“main function”中打开)

^{pr2}$

我的.txt文件是:

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

我在那份报纸上看到的是:

警报

警报

警报

警报

警报

但我想:

玛丽·考尔斯

约翰考尔斯

盗窃

地震

警报

怎么了?为什么列表中以前的所有条目都在更改?在

谢谢你!在


Tags: 文件nameselftxtobjectinitvardef
3条回答

1)如果要在variable的构造函数中初始化名称,则必须进一步缩进赋值。在

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

2)您的主要问题是,您希望使用以下行创建variable的新实例:

^{pr2}$

你必须写下:

x = variable();

主要问题是当代码检测到以“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()

x=variable使x引用类variable。您永远不会创建该类的任何实例,而是反复修改类级变量name。在

在程序的末尾,当您打印时,variable.name当然有最后一个赋值给它,在本例中是'Alarm'。在

如果执行print(list_of_variables),您将看到以下内容:

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

等等

x = variable更改为x = variable(),您将看到(例如):

^{pr2}$

等等

相关问题 更多 >