gpt4 book ai didi

Python:通过将对象分配给另一个对象来修改对象

转载 作者:太空宇宙 更新时间:2023-11-04 07:49:20 25 4
gpt4 key购买 nike

我是 Python 新手(来自 C++),理解粗略地说,所有变量(名称)都是对 Python 对象的引用。其中一些对象是可变的(列表),而另一些则不是(元组,但如果它们本身是可变的,您可以更改其元素)。

对于可变对象,我可以通过它们所绑定(bind)的名称访问它们的修饰函数(例如 .append())来修改它们。例如:

myList = [1,2,3,4]
myList.append(5)

但是,我知道简单地将 myList 分配给第二个列表只会实例化第二个列表并将 myList 重新分配给它;原始列表 [1,2,3,4] 仍然存在,直到垃圾回收将其清理干净(如果为它分配了另一个名称,则不清理)。

我的问题:

假设我有一个 Point 类:

class Point:
def __init__(self, x=0, y=0):
self.x = x
self.y = y

p1 = Point(1,1)
p1.x = 2
p1.y = 2

我如何用一个命令替换 p1.x = 2p1.y = 2 ,该命令只分配我的 Point(1,1) 对象到 Point(2,2) 对象?显然,p1 = Point(2,2) 不起作用,因为这只是将 p1 名称重新分配给一个新的和不同的 Point(2,2) 对象(这是不是我需要的!)。

是否有内置的方法来执行此操作,或者我是否需要在 Point 中定义一个额外的修饰函数:

def changePoint(self, newPoint):
self.x = newPoint.x
self.y = newPoint.y

为了在单个命令中执行此操作(即通过 p1.changePoint(Point(2,2)))?在 C++ 中,您通常可以只使用类的隐式定义的重载赋值运算符 (operator=) 并在单个命令中完成此操作:

SimpleNameClass* objectPtr = new SimpleNameClass("Bob");
//Dereferencing objectPtr and assigning new object:
*objectPtr = SimpleNameClass("Jim");

//Now objectPtr still points to (references) the same address in memory,
//but the underlying object is completely different.

总的来说,当我想将我的对象转换为一个新对象时,必须单独更改每个属性似乎很乏味,尤其是当我的对象包含许多属性时!

编辑:

加上 Jainil 的回答,事实证明我根本不需要更改 init 的定义,我可以只使用上面的版本。然后,您可以使用单个命令将一个 Point 对象转换为另一个对象,如下所示:

p1.__init__(2,2) #Replaces p1.x = 2, p1.y = 2

它的工作原理是因为原始的 init 需要 2 个参数。因此,标准的 vanilla init 方法基本上已经能够更改底层对象,除了实例化它(至少在这种情况下)。伊皮。

最佳答案

一种方法是使用元组拆包进行分配:

p1.x, p1.y = 2, 2

或者您可以在您的类中实现一个 setter 方法:

def set_xy(self, x, y):
self.x, self.y = x, y

但是创建一个新实例(对于这么简单的类)可能更有意义:

p1 = Point(2, 2)

在 python 中,您不能覆盖赋值运算符 =

关于Python:通过将对象分配给另一个对象来修改对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57638832/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com