我对不可变类型是多么困惑.我知道该float对象被认为是不可变的,我的书中有这种类型的例子:
class RoundFloat(float):
def __new__(cls, val):
return float.__new__(cls, round(val, 2))
Run Code Online (Sandbox Code Playgroud)
这是因为类结构/层次结构被认为是不可变的吗?意思float是在类的顶部并且是它自己的方法调用.类似于这种类型的例子(即使我的书说dict是可变的):
class SortedKeyDict(dict):
def __new__(cls, val):
return dict.__new__(cls, val.clear())
Run Code Online (Sandbox Code Playgroud)
虽然可变的东西在类中有方法,但是这种类型的例子:
class SortedKeyDict_a(dict):
def example(self):
return self.keys()
Run Code Online (Sandbox Code Playgroud)
另外,对于最后一个class(SortedKeyDict_a),如果我将这种类型的集合传递给它:
d = (('zheng-cai', 67), ('hui-jun', 68),('xin-yi', 2))
Run Code Online (Sandbox Code Playgroud)
在不调用example方法的情况下,它返回一个字典.SortedKeyDictwith 将其__new__标记为错误.我尝试将整数传递给RoundFloat类,__new__并且它没有标记错误.
我在这里读了一篇关于Stack Overflow的评论,在更改列表时进行切片分配的内存效率更高.例如,
a[:] = [i + 6 for i in a]
Run Code Online (Sandbox Code Playgroud)
应该比内存更有效
a = [i + 6 for i in a]
Run Code Online (Sandbox Code Playgroud)
因为前者替换现有列表中的元素,而后者创建一个新列表并重新绑定a到该新列表,将旧内容留a在内存中,直到它可以被垃圾收集.对速度进行基准测试,后者稍快一些:
$ python -mtimeit -s 'a = [1, 2, 3]' 'a[:] = [i + 6 for i in a]'
1000000 loops, best of 3: 1.53 usec per loop
$ python -mtimeit -s 'a = [1, 2, 3]' 'a = [i + 6 for i in a]'
1000000 loops, best of 3: 1.37 usec per loop …Run Code Online (Sandbox Code Playgroud) 在这里阅读Python 3.2教程,最后一个例子是
a[:] = []
Run Code Online (Sandbox Code Playgroud)
这相当于
a = []
Run Code Online (Sandbox Code Playgroud)
?如果是,为什么他们写a[:]而不是a?如果不是,有什么区别?