Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python-参数正在更改_Python - Fatal编程技术网

Python-参数正在更改

Python-参数正在更改,python,Python,所以,我有这门课 class table: h = 0 g = 0 这个类中有一个元素叫做aux aux = table 辅助g等于零。 稍后我调用这个函数moveaux move(x): newTable = table newTable.g = x.g + 1 newTable.g按预期接收1,但x.g也从0更改为1。为什么? 提前感谢Adriano,这是因为您正在声明a的等价物,当您更新它时,该类的每个实例都会得到更新。您想要的是这样声明: class

所以,我有这门课

class table:
    h = 0
    g = 0
这个类中有一个元素叫做aux

aux = table
辅助g等于零。 稍后我调用这个函数moveaux

move(x):
    newTable = table
    newTable.g = x.g + 1
newTable.g按预期接收1,但x.g也从0更改为1。为什么?
提前感谢Adriano,这是因为您正在声明a的等价物,当您更新它时,该类的每个实例都会得到更新。您想要的是这样声明:

class table:
    def __init__(self):
        self.h = 0
        self.g = 0
move(x):
    newTable = table()
    newTable.g = x.g + 1
t1 = Table()
t2 = Table()
t1.move(10)
print(t1.h)   # will print 10
print(t2.h)   # will print 0
现在,当您像这样实例化这个类:aux=table时,它会将值分配给table的那个实例——只是aux变量

您的移动功能如下所示:

class table:
    def __init__(self):
        self.h = 0
        self.g = 0
move(x):
    newTable = table()
    newTable.g = x.g + 1
t1 = Table()
t2 = Table()
t1.move(10)
print(t1.h)   # will print 10
print(t2.h)   # will print 0
这将增加newTable.g的值,但不是x.g的值。您可能还希望像这样返回新表:返回newTable,然后可以在其他函数中使用它


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

h和g是静态的,即类变量。h和g对于类表的对象不是唯一的,而是该类本身的属性

通过仅在类上定义属性,它们将绑定到整个静态类,而不是单个实例或对象。您更希望在构造函数中分配它们:

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

    def move(self, delta):
        self.h += deta
注意,我还将move函数更改为方法。不同之处在于,方法会更改单个实例的状态

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

class table:
    def __init__(self):
        self.h = 0
        self.g = 0
move(x):
    newTable = table()
    newTable.g = x.g + 1
t1 = Table()
t2 = Table()
t1.move(10)
print(t1.h)   # will print 10
print(t2.h)   # will print 0
当你这么做的时候:

aux = table
这是:

newTable = table
您没有创建类表的新对象实例。您只需使用两个不同的变量引用类表自己的实例。简而言之,aux和newTable引用都原谅我这么做;指向同一件事


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

请注意,OP实际上根本没有实例化该类;在他的代码中,aux和newTable都只是对类本身的引用。是的,我知道,但从问题描述来看,我认为他想这样做是公平的。我将编辑我的答案,以包含一些关于实例化的信息。这来自于一直在语言之间切换。。。叹气