Python方法返回值

use*_*591 2 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)
Run Code Online (Sandbox Code Playgroud)

输出是:

['2', '3', '4', '5', '6', '7', '8', '9']
['2', '3', '4', '5', '6', '7', '8', '9']
Run Code Online (Sandbox Code Playgroud)

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

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

Mil*_*ica 5

从Python文档:

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

(来源)

基本上,您需要明确地创建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

(来源)

由于a.row是一个列表,请尝试以下方法:

b = list(a.row)
Run Code Online (Sandbox Code Playgroud)