我在创建的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的副本,在这种情况下看起来更像是指针。
任何帮助解释这实际上是如何工作的将非常感激。
答案 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。
(source)
由于a.row是一个列表,请尝试:
b = list(a.row)
答案 1 :(得分:1)
正如Milo Price所说,当你b = a.row
时,b现在存储对a.row的引用。所以当你改变b时,它也会改变a.row。您也可以尝试切片列表,即b = a.row[:]