Python - 正在更改参数

时间:2015-12-16 20:57:45

标签: python

所以,我有这个班级

class table:
    h = 0
    g = 0

我有这个类的一个元素叫做aux。

aux = table

aux.g等于零 后来我称这个函数为move(aux)

move(x):
    newTable = table
    newTable.g = x.g + 1

newTable.g按预期收到1,但x.g也从0变为1.为什么?
在此先感谢,阿德里亚诺

4 个答案:

答案 0 :(得分:6)

这是因为您声明等效于static class variable,当您更新它时,它会针对该类的每个实例进行更新。你想要的是像这样声明instance variables

aux = table()

现在,当你实例化这样的类:aux时,它会将值分配给表的实例 - 只是move(x): newTable = table() newTable.g = x.g + 1 变量。

您的移动功能如下所示:

newTable.g

会增加x.g的值,但不会 return newTable的值。你可能也想要像这样返回新表:aux = table然后你可以在其他函数中使用它。

值得注意的是,在您的代码中,您实际上从未实际执行表类的实例化。这意味着,当您指定aux时,它只会将类的引用分配给变量__init__。要创建类的实例,可以像调用函数一样调用类 - 这称为构造函数 - 它调用类的aux = table()方法。因此,当我声明__init__时,将执行表ServletRequest.getRemoteAddr()方法,然后返回该类的新实例。

答案 1 :(得分:2)

hg是静态的,即“类变量”。 hg对于类table的对象不是唯一的,而是该类本身的属性。

答案 2 :(得分:2)

通过在类上定义属性,它们将绑定到整个类(静态),而不是单个实例(也称为对象)。你更想要的是在构造函数中分配它们:

class Table:
    def __init__(self):
        self.h = 0
        self.g = 0

    def move(self, delta):
        self.h += deta

请注意,我还将移动功能更改为方法。不同之处在于方法会更改单个实例的状态。

然后,您可以创建实例并使用它们:

t1 = Table()
t2 = Table()
t1.move(10)
print(t1.h)   # will print 10
print(t2.h)   # will print 0

答案 3 :(得分:2)

当你这样做时:

accel = 20.0  # steps/sec/sec
time_passed = 0.000
steps_done = 0
cur_speed = 0  # steps/sec
time_for_next_step = 0.0

while (steps_done < steps_needed):
    if (time_passed >= time_for_next_step): 
        self.oneStep(direction, stepstyle)
        steps_done += 1
        time_for_next_step = time_passed + 1.0/cur_speed
    time.sleep(1);  # 1 millisecond, I assume
    time_passed += 0.001
    cur_speed += accel/1000.0

和此:

aux = table

您没有创建类newTable = table 的新对象实例。您只需使用两个不同的变量引用类table自己的实例。总之,tableaux 引用(原谅我这样做; 指向)同样的事情。

请注意,newTable是类h, g的共享属性。它们由类table的所有实例共享。