实例变量未在for循环中修改

时间:2017-09-13 15:04:50

标签: python class for-loop instance-variables

我有一个带有实例变量的类,我想在循环中使用类方法修改,我正在做的简化版本:

class Example:
    def __init__(self,x,z):
        self.x=x
        self.z=z

    def run(self,y):

        temp_list=[self.x, self.z]

        for ind,item in enumerate(temp_list):
            temp_list[ind] = temp_list[ind]+y

        print (self.x, self.z)

ex = Example(5,6)
ex.run(5)

我得到的输出是[5,6]而不是所需的[10,11]。 我想知道是否有人能指出我为何会发生这种情况的解释?

4 个答案:

答案 0 :(得分:5)

run()中,您可以创建一个包含2个项目的列表,值为self.xself.z。接下来,迭代该列表,并通过向其添加y来修改每个值。 在for - 循环后,temp_list将为[10, 11],但您尚未以任何方式修改self.xself.y

因此,print()调用将打印未经修改的self.xself.y值,在您的示例中为5和6。

答案 1 :(得分:3)

如果您实际上没有写self.x = ...,那么您通常可以认为self.x不会被修改。当您编写temp_list[ind] + y并将其存储在temp_list[ind]时,您需要使用新值更新列表,这与其他变量发生的任何值无关保持(包括您的对象的x变量)。

答案 2 :(得分:0)

要使用类似于您的代码获得所需结果,您可以执行以下操作:

class Example:
    def __init__(self,x,z):
        self.list=[x, z]
    def run(self,y):

        for ind,item in enumerate(self.list):
            self.list[ind] = self.list[ind]+y

        print (self.list)

ex = Example(5,6)
ex.run(5)

这将在您的init定义中创建一个self.list项,然后用于迭代初始值并将y值添加到其中。你遇到的主要错误是打印一个未经改动的列表(但你在正确的轨道上!)

希望这有帮助!

答案 3 :(得分:0)

您可以使用。

下的示例
class Example:
    def __init__(self, x, z):
        self.x = x
        self.z = z

    def run(self,y):
        # Put your init arguments into the array
        result = [self.x, self.z]

        # Modify your init arguments
        for x in range(len(result)):
            result[x] += y

        # Return the array with new values
        return result

ex = Example(5, 6)
print(ex.run(5))

也许该链接对您有帮助,learn for loop in python