Python列表副本以及要用作类变量的



我对以下结果感到困惑,因为我的理解是[:]进行浅层复制,当您更改旧列表或新复制的列表时,它们都应该更改吗?(这是我正在关注的Coursera课程中的一个节目(。此外,如果我想将列表声明为类变量,并将其作为默认值,如果选择,子类可以覆盖/修改它,但父类应该保持不变,这是正确的方法吗?非常感谢你的帮助。

oldlist=[["a"],"b"]
newlist= oldlist[:]
newlist[0]="2"
oldlist[0].append(["c"])
print(oldlist) #printed out  [['a', ['c']], 'b']
print(newlist) #printed out ['2', 'b']
class Book():
similar_books =['book one','book two']
def __init__ (self, n, l):
self.name= n
self.like = l
self.similar_books = self.similar_books[:]  # is it the correct way to do so?

根据Python官方文档,列表切片是一个浅拷贝。在这种情况下,浅层副本构造一个新的复合对象,然后插入对原始包含对象的引用。当";2〃;被分配给newlist的[0]索引,引用被覆盖,newlist不再是复合对象。如果您只将["c"]附加到oldlist的索引[0],您将获得预期的浅层复制行为。

对于问题的第二部分,在父类内部(但在构造函数外部(初始化的对象是静态的,不会被子类覆盖或修改。出于好奇,为什么不直接在init方法中将[bookone','booktwo']分配给self.similar_books呢?

class Book(object):
def __init__(self, n, l):
self.name = n
self.like = l
self.similar_books = ['book one', 'book two']

class FavouriteBook(Book):
def __init__(self):
super().__init__('name', 'like')
self.similar_books = ['book_3']

最新更新