【问题标题】:Python list copy and which to use as class variablePython列表副本以及用作类变量的
【发布时间】:2021-01-07 03:47:26
【问题描述】:

我对以下结果感到困惑,因为我的理解是[:] 进行了浅拷贝,当您更改旧列表或新复制的列表时,它们都应该更改吗? (这是我正在关注的 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?

【问题讨论】:

  • 我认为您正在从代码中获得所需的行为。你可以以同样的方式继续前进。
  • 我认为你应该 google : 'static property in pyhton' 代替..

标签: python python-3.x list class copy


【解决方案1】:

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

对于您问题的第二部分,在父类内部(但在构造函数外部)初始化的对象是静态的,不会被子类覆盖或修改。出于好奇,为什么不直接在 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']

【讨论】:

  • 谢谢。这个想法是,如果有子类,默认情况下子类将具有similar_books=['book one','book two'],但子类也可以执行类似的操作来定义自己的similar_book 属性:class FavouriteBook(Book): similar_books = ['book3']。这样FavouriteBook 类有 book3 而不是 book 1 和 2 作为similar_book。这是要走的路吗?
  • 在构造函数之前初始化 similar_books=['book one','book two'] 是多余的。我的假设是您将调用超级构造函数来为子类super().__init__('name', 'like') 分配名称和喜欢。调用超级构造函数后,子类将继承similar_books,然后可以用self.similar_books = ['book_3'] 覆盖它。用示例更新答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-07-03
  • 1970-01-01
  • 2015-08-06
  • 1970-01-01
  • 1970-01-01
  • 2021-11-27
  • 2014-07-22
相关资源
最近更新 更多