我在创建的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的副本,在这种情况下它看起来更像是一个指针.
任何帮助解释这实际上如何工作将非常感激.
从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.
(来源)
由于a.row是一个列表,请尝试以下方法:
b = list(a.row)
Run Code Online (Sandbox Code Playgroud)