其中哪些在Python中是不变的?

| 我试图弄清楚以下内容在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也应该是不可变的,因为尽管它是非理性的,但g是一个数字 最后,我是一个函数,这意味着它应该是可变的? 我不太确定我了解不变性的概念。函数不可变意味着什么?班级是一成不变的?     
已邀请:
e
是可变的。例如,您可以在类
e.foo = lambda self,x: x
上添加一个新方法。
f
是可变的。例如,您可以向该类实例添加一个新字段:“ 4”。
g
是不变的。您无法更改任何内容。
i
不是一成不变的。您可以对它做各种邪恶的事情:
i.func_code = (lambda x: 123).func_code
之后,
i(10)
将变为123而不是100。(您也可以对它做更多合理的事情。ѭ9After之后,
help(i)
会得到更有益的结果。) 如果您可以对某个对象执行某些操作以更改其将来的可能行为,则该对象是可变的。您无法更改
10
的行为;您可以更改功能对象,类,类实例或列表的行为。 (但不是元组。一旦创建了元组,它就会一直存在直到存在。)     
正式吗?如果对象可以更改值而不更改标识,则该对象是可变的。 列表是可变的,因此特定实例的值可以随时间变化:
>>> 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
frozenset
需要不可变成员,作为对象的值)影响应如何将其存储在数据结构中。如果允许使用可变条目,则在存储后对其进行了修改,它们可能最终放在错误的位置) 与普遍的看法相反,不会覆盖相等性定义的用户定义类在技术上是不可变的。这是因为用户定义类的\“ value \”的默认定义仅为
id(self)
。当一个对象的值是它的身份时,很显然它们没有办法随时间变化,因此该对象不能视为“可变”。 非正式地?大多数人都按照Gareth McCaughan的回答使用直观的“我可以更改吗?”定义。它与形式定义具有相同的基本思想,只是在相等性检查方面使用的术语“值”比技术定义更广泛的含义。     

要回复问题请先登录注册