相关疑难解决方法(0)

不可变与可变类型

我对不可变类型是多么困惑.我知道该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__并且它没有标记错误.

python mutable immutability

172
推荐指数
11
解决办法
25万
查看次数

Python切片分配内存使用情况

我在这里读了一篇关于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 performance benchmarking memory-management

22
推荐指数
1
解决办法
3267
查看次数

`a`和`a [:]`之间有什么区别?

这里阅读Python 3.2教程,最后一个例子是

a[:] = []
Run Code Online (Sandbox Code Playgroud)

这相当于

a = []
Run Code Online (Sandbox Code Playgroud)

?如果是,为什么他们写a[:]而不是a?如果不是,有什么区别?

python

0
推荐指数
1
解决办法
140
查看次数