我试图弄清楚以下是否在Sage中是不可变的(它是基于Python构建的,所以我相信如果它在python中是不可变的,我相信在大多数情况下它将在Sage中不可变)
下面是对象e,f,g,i
class e: pass
f = e()
g = pi # (g's "type" in Sage is symbolic expression. It's supposed to be 3.1415....etc)
i = lambda x: x*x
我认为e是一个类,这意味着它是可变的(不可变类是否有意义?不能修改所有类吗?)。由于f是一个类的实例,我猜它也是可变的,因为类是可变的。
由于数字在Python中是不可变的,因此g也应该是不可变的,因为它是一个数字,尽管是非理性的
最后我是一个函数,这意味着它应该是可变的?
我不太确定我理解不变性的概念。函数是不可变的意味着什么?对于一个不可变的类?
答案 0 :(得分:7)
e
是可变的。例如,您可以在课程中添加新方法:e.foo = lambda self,x: x
。
f
是可变的。例如,您可以向此类实例添加新字段:f.x = 99
。
g
是不可变的。你不能改变任何事情。
i
不是一成不变的。你可以做各种各样的邪恶事情:i.func_code = (lambda x: 123).func_code
之后i(10)
将是123而不是100.(你也可以做更合理的事情。i.__doc__ = "This function returns the square of its argument."
之后你会得到来自help(i)
的更有帮助的结果。)
如果您可以对对象进行更改其未来可能行为的操作,则对象是可变的。您无法更改10
的行为;您可以更改函数对象或类,类实例或列表的行为。 (但不是一个元组。一旦制作了一个元组,只要它存在就会保持原样。)
答案 1 :(得分:2)
形式上?如果对象可以更改 value 而不更改身份,则该对象是可变的。
列表是可变的,因此特定实例的值可能会随时间而变化:
>>> x = orig_x = []
>>> x == []
True
>>> x += [1]
>>> x == [] # The value of x has changed
False
>>> x is orig_x # But the identity remains the same
True
然而,数字是不可变的,因此它们的价值不会改变。相反,必须更新变量以引用完全不同的对象:
>>> x = orig_x = 1
>>> x == 1
True
>>> x += 1
>>> x == 1 # Again, the value of x has changed
False
>>> x is orig_x # But now the identity has changed as well
False
不可变性是一个重要的概念,因为知道对象的值不能改变会让你对它做出某些假设(例如,dict
实际上需要不可变密钥和set
以及{{1}需要不可变成员,因为对象的值会影响它应该如何存储在数据结构中。如果允许可变条目,如果它们在存储后被修改,它们可能最终会出错的地方。
与普遍看法相反,不覆盖相等定义的用户定义类在技术上是不可变的。这是因为用户定义的类的“值”的默认定义仅为frozenset
。当一个对象的值 它的标识时,它们显然没有办法随时间变化,因此该对象的质量不是“可变的”。
非正式?大多数人使用直观的“我能改变吗?”按照Gareth McCaughan的回答定义。它与正式定义的基本思想相同,只是在平等检查方面使用了“价值”一词的宽泛含义而不是技术定义。