我的朋友说copy.copy()函数的作用是将变量的值和类复制到另一个变量。我说这堂课是价值的一部分,但他不相信。代码:
harry = Animal('hippogriff')
他说'hippogriff'是物体的价值,而不是动物('hippogriff')。这是真的吗?
答案 0 :(得分:5)
copy.copy()
将创建对象的浅层副本;它将创建一个新的类型实例并复制所有属性。
在这种情况下,会创建一个新的Animal()
实例,并且无论什么属性保存对字符串hippogriff
的引用都会被复制到新副本中。如果harry
上有任何可变的可变属性(字典,列表,其他自定义类实例),则新副本将与harry
共享对这些属性的引用,并且在两个实例上都可以看到任何更改。
Animal()
实例是这里的实际'值';但它是一个复合对象,它的属性本身就是值。
对于不可变的Python“原始”类型,例如int
或str
,对象本身就是您朋友所指的“值”; str
对象上没有包含字符串值的属性。毕竟,它不是复合值。但是你不应该在这里过多关注“价值”的想法。
改为称呼它们为对象。在Python中,一切都是对象,对象具有类型,许多可以具有属性,这些属性引用其他对象。甚至方法也是这方面的对象; 'hippogriff'
字符串具有.upper
和.lower
属性,这两个属性都可以引用您可以调用的方法,这些方法也是对象。在Python中,它一直是乌龟!
答案 1 :(得分:2)
他说'hippogriff'是物体的价值,而不是 动物( '骏鹰')。这是真的吗?
这一般是错误的。例如,考虑:
class Animal:
def __init__(self, name):
self.name = name
self.cointoss = random.choice(['heads', 'tails'])
harry = Animal('hippogriff')
然后copy.copy()
副本不只是'hippogriff'
,它也是投掷硬币的结果。 'hippogriff'
和Animal('hippogriff')
都没有充分表达此对象的价值。
粗略地说,在没有引用任何特定编程语言的情况下,对象的“值”是作为每个实例数据存储的任何内容。
通过粗略定义,对象的类是在Python中的值的一部分。然而Python data model(感谢Martijn)将对象的“类型”与其“值”区分开来。请注意,在谈论类型时,它会在脚注中承认它所说的内容(“类型”不能改变)是不正确的,因此您不一定要将此文本视为公理。
无论如何,您通常可以认为对象的类型与其值是分开的。实际上它是对象的可变状态的一部分,因此对于一些罕见的目的,您可能会违反Python的定义并将其视为值的一部分。从根本上说,这是你选择如何定义“对象的价值”的问题,但是如果你选择Python文档中的定义,这在谈论Python时是合理的,那么它们就是不同的东西。
你也可以考虑copy.copy
的实现是否必须做任何特别的事情来处理对象的类型 - 如果它没有那么显然类型的行为就像值的一部分甚至虽然它的定义不是它的一部分。