Python 列表副本和用作 class 变量
Python list copy and which to use as class variable
我对以下结果感到困惑,因为我的理解是 [:]
进行浅拷贝,当您更改旧列表或新复制的列表时,它们都应该更改吗? (这是在我正在学习的一门 Coursera 课程中展示的)。此外,如果我想将列表声明为 class 变量,其意图是默认值,如果选择,子 classes 可以覆盖 it/modify 它,但父级应该保持不变,这是正确的方法吗?非常感谢您的帮助。
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?
根据 Official Python Documentation 列表切片是浅拷贝。在这种情况下,浅拷贝构造一个新的复合对象,然后插入对原始包含对象的引用。当“2”赋值给newlist的[0]索引时,引用被覆盖,newlist不再是复合对象。如果您仅将 ["c"] 附加到旧列表的索引 [0],您将获得预期的浅拷贝行为。
对于问题的第二部分,在父 class 内部(但在构造函数外部)初始化的对象是静态的,不会被子 classes 覆盖或修改。出于好奇,为什么不在 init 方法中直接将 ['book one','book two'] 赋值给 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']
我对以下结果感到困惑,因为我的理解是 [:]
进行浅拷贝,当您更改旧列表或新复制的列表时,它们都应该更改吗? (这是在我正在学习的一门 Coursera 课程中展示的)。此外,如果我想将列表声明为 class 变量,其意图是默认值,如果选择,子 classes 可以覆盖 it/modify 它,但父级应该保持不变,这是正确的方法吗?非常感谢您的帮助。
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?
根据 Official Python Documentation 列表切片是浅拷贝。在这种情况下,浅拷贝构造一个新的复合对象,然后插入对原始包含对象的引用。当“2”赋值给newlist的[0]索引时,引用被覆盖,newlist不再是复合对象。如果您仅将 ["c"] 附加到旧列表的索引 [0],您将获得预期的浅拷贝行为。
对于问题的第二部分,在父 class 内部(但在构造函数外部)初始化的对象是静态的,不会被子 classes 覆盖或修改。出于好奇,为什么不在 init 方法中直接将 ['book one','book two'] 赋值给 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']