Python对象列表是共享变量

2024-09-28 22:07:31 发布

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

班级旅行有一张单子,self.leg\u英里你知道吗

类ManyJourneys具有由创建的旅程列表

self.journeys = []
for i in range(2):
    self.journeys.append(Journey())

从一些输入中,我将每段旅程的里程添加到列表中,如下所示:

self.journeys[self.count].addLeg(temp)

临时工是我从名单上读到的数字。它总是更改为上一行之前输入的内容。你知道吗

出于某种原因,它没有为旅程[1]创建新的列表,而是添加到已创建的列表中。你知道吗

例如: 如果旅程[0]的航程是[4,5,6] 我继续旅程[1],加上4和6 它会: 里程=[4,5,6,4,6]

我不明白为什么它在增加。我有自己的想法。 我不明白如何上传代码或图片。你知道吗

我希望这是足够的信息来解决这个问题

编辑:这是我的代码。你知道吗

class Journey:

    def __init__(self,odometer=0,leg_miles=[],leg_gas=[]):  #constructor
        self.odometer = odometer
        self.leg_miles = leg_miles
        self.leg_gas = leg_gas

    def addLeg(self,miles,gas):
        #adds to a list of miles and gas 
        self.leg_miles.append(miles)
        self.leg_gas.append(gas)

    def getLists(self):
        #returns the list of miles and the list of gas 
        return self.leg_miles,self.leg_gas

    def calculate(self):
        #calculate the miles per litre for the journey and return
        miles_per_litre = 0
        for i in range(len(self.leg_miles)):    #calcs miles per litre for each leg and adds to total
            miles_per_litre += int(self.leg_miles[i]/self.leg_gas[i])
        return miles_per_litre


class ManyJourneys:

    def __init__(self,name):

        self.myfile = open(name,"r")
        self.content = self.myfile.read().split("\n")

        self.journeys = []

        for i in range(self.content.count("")+1):
            self.journeys.append(Journey())

        self.count = 0

        for i in self.content:
            if i == "":
                self.count+=1
            else:
                temp = i.split(" ")
                self.journeys[self.count].addLeg(int(temp[0]),int(temp[1]))



    def statistics(self):

        sum = 0
        for i in self.journeys:
            sum += i.calculate()

        return sum/len(self.journeys)


def main():
    filename  = input("Please enter a file name. (Eg: test.txt): ")
    manyJourneys1 = ManyJourneys(filename)
    print("You got {0} miles per litre.".format(manyJourneys1.statistics()))

main()

一个示例文本文件

100 54
340 109
23 4

333 33
4500 678

Tags: inself列表fordefcounttempgas
2条回答

在Python中,默认值有一个不明显的特性-它们每次都代表同一个对象,当使用可变值作为默认值时,这会导致令人惊讶的行为:

def add(value, l=[]):
    l.append(value)
    return l

add(1) # [1]
add(2) # [1, 2]

为了不落入这个陷阱,不要以这种方式使用列表或任何其他可变值。如果需要将某些内容初始化为空列表,请在函数/方法体中执行:

def __init__(self, odometer=0, leg_miles=None, leg_gas=None):
    self.odometer = odometer
    self.leg_miles = leg_miles or []
    self.leg_gas = leg_gas or []

你搞砸了你对Journey的定义。可变类型必须在初始值设定项或方法中指定,而不是在类或默认参数中指定。你知道吗

相关问题 更多 >