Python方法返回值

时间:2014-01-10 00:10:32

标签: python

我在创建的python类中遇到了一些麻烦。我试图通过剥离任何不相关的代码来创建最简单的类来调试它。我仍然有同样的问题。

class MyClass(object):

    def __init__(self):
        self.row = ['1', '2', '3', '4', '5', '6', '7', '8', '9']

    def get_row(self):
        return self.row

if __name__ == "__main__":
    a = MyClass()

    b = a.row

    b.remove('1')

    print(a.row)
    print(b)

输出结果为:

['2', '3', '4', '5', '6', '7', '8', '9']
['2', '3', '4', '5', '6', '7', '8', '9']

当我执行b.remove('1')时,它会按预期从b列表中删除第一个条目,但当我查看a.row时,它也已从中删除。我对类的理解和返回值b应该是a的副本,在这种情况下看起来更像是指针。

任何帮助解释这实际上是如何工作的将非常感激。

2 个答案:

答案 0 :(得分:5)

来自Python文档:

  

Python中的赋值语句不复制对象,它们在目标和对象之间创建绑定。对于可变或包含可变项目的集合,有时需要一个副本,因此可以更改一个副本而不更改另一个副本。

source

基本上,您需要明确制作a.row的新副本。你是对的,它的行为就像一个指针。

特定于列表的示例,带图片:

  

Python没有像C这样的变量。在C中,变量不仅仅是一个名称,它是一组位;变量存在于内存中的某处。在Python中,变量只是附加到对象的标记。

     

请考虑以下声明:

     

a = [1,2,3]

     

这意味着指向我们刚刚创建的列表[1,2,3],但是a不是列表。如果我们这样做:

     

b = a

     

我们没有复制a引用的列表。我们刚刚创建了一个新标记b并将其附加到a指向的列表中。如下图所示:

     

http://henry.precheur.org/python/list1.png

     

[...]

     

现在我们要复制一个引用的列表。我们需要创建一个新列表来附加b。

     

http://henry.precheur.org/python/list2.png

source

由于a.row是一个列表,请尝试:

b = list(a.row)

答案 1 :(得分:1)

正如Milo Price所说,当你b = a.row时,b现在存储对a.row的引用。所以当你改变b时,它也会改变a.row。您也可以尝试切片列表,即b = a.row[:]