首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Python对象列表正在共享变量

Python对象列表正在共享变量
EN

Stack Overflow用户
提问于 2014-03-25 10:38:16
回答 2查看 75关注 0票数 0

课程之旅有一个列表,self.leg_miles

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

代码语言:javascript
运行
复制
self.journeys = []
for i in range(2):
    self.journeys.append(Journey())

根据一些输入,我将每个旅程的leg_miles添加到列表中,如下所示:

代码语言:javascript
运行
复制
self.journeys[self.count].addLeg(temp)

temp是我从列表中读取的数字。它始终更改为在上述行之前输入的内容。

出于某种原因,它不是为journey1创建新的列表,而是添加到已创建的列表中。

例如:如果leg_miles为4,5,6,而我继续使用journey1添加4和6,那么它将为: leg_miles = 4,5,6,4,6

我不明白为什么它还在增加。我有自己在里面。我不知道如何上传代码或图片。

我希望这些信息足以解决这个问题。

编辑:这是我的代码。

代码语言:javascript
运行
复制
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()

一个示例文本文件是

代码语言:javascript
运行
复制
100 54
340 109
23 4

333 33
4500 678
EN

回答 2

Stack Overflow用户

发布于 2014-03-25 13:27:03

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

代码语言:javascript
运行
复制
def add(value, l=[]):
    l.append(value)
    return l

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

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

代码语言:javascript
运行
复制
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 []
票数 2
EN

Stack Overflow用户

发布于 2014-03-25 10:52:36

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22624482

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档