我对什么是不可变类型感到困惑。我知道该float对象被认为是不可变的,在我的书中有这样的例子:
class RoundFloat(float):
def __new__(cls, val):
return float.__new__(cls, round(val, 2))
由于类的结构/层次结构,这是否被认为是不可变的?意思float是在类的顶部,是它自己的方法调用。类似于此类示例(即使我的书说的dict是可变的):
class SortedKeyDict(dict):
def __new__(cls, val):
return dict.__new__(cls, val.clear())
可变的东西在类内部具有方法,例如以下类型:
class SortedKeyDict_a(dict):
def example(self):
return self.keys()
另外,对于最后一个class(SortedKeyDict_a)
,如果我将这种类型的set传递给它:
d = (('zheng-cai', 67), ('hui-jun', 68),('xin-yi', 2))
不调用该example方法,它返回一个字典。在SortedKeyDict
用__new__其
标记为错误。我尝试使用将整数传递给RoundFloat
类,__new__
并且它未标记任何错误。
什么?浮游物是一成不变的吗?但是我不能
x = 5.0
x += 7.0
print x # 12.0
那不是“ mut” x
吗?
好吧,你同意字符串是不可变的,对吗?但是你可以做同样的事情。
s = 'foo'
s += 'bar'
print s # foobar
变量的值会更改,但是会通过更改变量引用的内容来更改。一个可变的类型可以改变这种方式,它可也 “到位”而改变。
这是区别。
x = something # immutable type
print x
func(x)
print x # prints the same thing
x = something # mutable type
print x
func(x)
print x # might print something different
x = something # immutable type
y = x
print x
# some statement that operates on y
print x # prints the same thing
x = something # mutable type
y = x
print x
# some statement that operates on y
print x # might print something different
具体例子
x = 'foo'
y = x
print x # foo
y += 'bar'
print x # foo
x = [1, 2, 3]
y = x
print x # [1, 2, 3]
y += [3, 2, 1]
print x # [1, 2, 3, 3, 2, 1]
def func(val):
val += 'bar'
x = 'foo'
print x # foo
func(x)
print x # foo
def func(val):
val += [3, 2, 1]
x = [1, 2, 3]
print x # [1, 2, 3]
func(x)
print x # [1, 2, 3, 3, 2, 1]
本文向大家介绍Python的可变类型和不可变类型?相关面试题,主要包含被问及Python的可变类型和不可变类型?时的应答技巧和注意事项,需要的朋友参考一下 可变数据类型:列表、字典、可变集合 不可变数据类型:数字、字符串、元组、不可变集合
问题内容: 我有以下课程: 这可以按预期工作(使用字符串的单词而不是字母来初始化集合)。但是,当我想对set的不可变版本执行相同操作时,该方法似乎被忽略: 我可以达到类似的目的吗? 问题答案: 是的,您需要重写特殊方法: 输出为:
我正在寻找一种在python中构建类的方法: setter在赋值前检查值的类型 暂时我找到了那两个装修师: 和 但我很难加入这两种方法。你能帮助我吗?你有什么想法吗?谢谢
问题内容: 我找到了一篇有趣的代码文章: 我真的很好奇了解创建此类的优势。我知道这里的此类对象是不可变的,因为一旦初始化就无法更改其变量值。我以前从未做过这样的事情,而且我真的不了解它的优势。 为什么是个好习惯? 您能说出可以使用这种方法的情况吗? 常量或只读变量呢?那不是很相似吗? 在文章中说,这不利于应用程序的性能。 但是为什么 呢? 问题答案: 您提到的示例是不可变对象。它在编程语言中被广泛
最后一点:如果这似乎与SO上的其他问题重复,我道歉。如前所述,我已经看了他们,但无法得到我想要的理解。
我有以下查询,我正在研究Java不可变类的概念,并得出以下分析。。 所有字段必须是私有的,最好是最终的 确保类不能被覆盖-使类成为最终类,或者使用静态工厂并保持构造函数私有 字段必须从构造函数/工厂填充 不要为字段提供任何setter 小心收集。使用Collections.unmodifiable*。 此外,集合应该只包含不可变对象 所有getter必须提供不可变对象或使用防御性复制 不要提供任何