【问题标题】:returning data in python在python中返回数据
【发布时间】:2011-03-29 20:01:21
【问题描述】:

我目前正在通过“深入了解 Python”来学习该语言,我对第 5 章的示例 5.10 有点困惑。 UserDict 普通方法

示例 5.10。 UserDict 普通方法

def copy(self):
    if self.__class__ is UserDict:
        return UserDict(self.data)
    import copy
    return copy.copy(self)

data 是字典。

我注意到,如果类是 UserDict 类型,那么它会返回 UserDict(self.data)。我很困惑的是,为什么你需要返回UserDict(self.data) 而不是只返回self.data? self.data 不是可以返回的字典吗?

如果有人能解释返回UserDict(self.data) 和self.data 之间的区别,我将不胜感激。

【问题讨论】:

  • 感谢大家,感谢大家的帮助。我真的很感激。

标签: python return-type


【解决方案1】:

它返回一个新的UserDict 对象,因为.copy() 应该返回一个与其复制相同类型的对象。

【讨论】:

    【解决方案2】:

    为了产生一个副本,你应该使用UserDict(self.data)。

    为什么我们使用UserDict(self.data) 而不是 self.data 是因为它返回的是与 self 相同的类的新实例。

    如果您只返回self.data,那么您没有制作副本。因为它返回dict,而不是UserDict 的实例。如果要制作副本,请使用UserDict(self.data)。

    【讨论】:

      【解决方案3】:

      您在这里看到的是优化。

      您可以使用UserDict 作为基类来编写您自己的子类。如果您没有覆盖子类上的 copy() 方法,那么您会从基类中获得一个,即您在此处查看的那个。

      所以基本上,它会检查它是否在子类中运行。如果不是,它知道复制自己的最快方法是使用自己的构造函数。但如果它在子类中运行,它不知道您可能添加了什么以及需要复制什么,因此它使用来自copy 模块的更通用的复制功能。这不会那么快,但它更有可能复制需要复制的内容。 (当然,如果你继承 UserDict...,你也许应该编写自己的 copy() 方法...)

      它不会返回self.data,因为self.data 是dict,而不是UserDict,它也不是副本。

      【讨论】:

        猜你喜欢
        • 2018-01-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-02-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多