Python:将可变(?)对象传递给方法

标签 python object methods arguments mutable

我正在尝试使用一个方法实现一个类,该方法使用一个对象调用另一个方法,该对象是该类的一部分,其中最低的方法改变了对象。我的实现有点复杂,所以我将只发布一些虚拟代码,以便您明白我在说什么:

class test:
    def __init__(self,list):
        self.obj = list
    def mult(self, x, n):
        x = x*n
    def numtimes(self, n):
        self.mult(self.obj, n)

现在,如果我创建一个这种类型的对象并运行 numtimes 方法,它不会更新 self.obj:

m = test([1,2,3,4])
m.numtimes(3)
m.obj  #returns [1,2,3,4]

而我希望它给我 [1,2,3,4,1,2,3,4,1,2,3,4]

基本上,我需要将 self.obj 传递给 mult 方法并让它改变 self.obj,这样当我调用 m.obj 时,我会得到 [1,2,3,4,1,2,3 ,4,1,2,3,4] 而不是 [1,2,3,4]。

我觉得这只是理解 python 如何将对象作为参数传递给方法的问题(就像它正在制作对象的副本,而我需要使用指针),但也许不是。我是 python 的新手,真的可以在这里使用一些帮助。

提前致谢!

最佳答案

请允许我谈谈更大的可变性主题。

列表是可变对象,支持可变操作和不可变操作。这意味着,就地更改列表的操作和返回新列表的操作。相比之下,元组只是不可变的。

因此,要乘以列表,您可以选择两种方法:

  1. a *= b

这是一个可变操作,将就地更改“a”。

  1. a = a * b

这是一个不可变操作。它将评估“a*b”,创建一个具有正确值的新列表,并将“a”分配给该新列表。

这里已经是您问题的解决方案。但是,我建议您继续阅读。当您将列表(和其他对象)作为参数传递时,您只是传递了一个新的引用,或指向同一列表的“指针”。因此,对该列表运行可变操作也会更改您传递的列表。当您编写时,结果可能是一个非常微妙的错误:

>>> my_list = [1,2,3]
>>> t = test(my_list)
>>> t.numtimes(2)
>>> my_list
[1,2,3,1,2,3]  # Not what you intended, probably!

这是我的最终建议。您可以选择使用可变操作,这很好。但是然后根据您的论点创建一个新副本,如下所示:

def __init__(self,l):
    self.obj = list(l)

或者使用不可变操作,并将它们重新分配给自己:

def mult(self, x, n):
    self.x = x*n

或者两者都做,特别安全没有坏处:)

关于Python:将可变(?)对象传递给方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19205921/

相关文章:

python - Plone - 从 View 中的成员文件夹获取并列出对象

javascript - Three.js - 访问场景中的子对象

c++ - 对于相对较新的计算机,有什么替代OL'C++ Beep()的好方法?

C#:为方法嵌套返回 'this'?

Python 正则表达式 : Reject one two-digit number and accept other two-digit numbers

python - 如何找到图像中的簇数?

python - 处理 ConnectionResetError

javascript - 对象/数组的深度比较

python - 如何删除输出末尾的空格

c++ - 类方法和参数传递