在Python中重用变量
在Python中,我经常像这样重复使用变量:
files = files[:batch_size]
我喜欢这种方法,因为它可以帮助我减少需要管理的变量数量。
我从来没有遇到过什么问题,但我在想是否会有一些潜在的缺点,比如性能方面的问题等等。
4 个回答
1
其实,重复使用变量并没有太多坏处,但你也不会得到什么好处。Python的垃圾回收机制会自动运行,去清理旧的对象,所以当你重新给变量赋值时,并不会立即节省内存。这和像C这样的静态编译语言不同,在C语言中,重复使用变量可以完全避免为新对象分配内存。
而且,这样做可能会让以后看你代码的人感到困惑,因为他们通常会期待新对象有新的名字(这是垃圾回收语言的一个特点)。
5
关于这个具体的例子:如果你只是想遍历、映射或者过滤结果,可以使用生成器,这样就可以避免复制数组。
import itertools
files = itertools.islice(files, batch_size)
至于一般情况:无论你是把新值赋给一个已经存在的名字,还是给一个新名字,从解释器或虚拟机的角度来看,这两者没有什么区别。两种方法生成的字节码几乎是完全一样的。
Python 2.7.2 (default, Nov 21 2011, 17:25:27)
[GCC 4.6.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import dis
>>> def func1(files):
... files = files[:100]
...
>>> def func2(files):
... new_files = files[:100]
...
>>> dis.dis(func1)
2 0 LOAD_FAST 0 (files)
3 LOAD_CONST 1 (100)
6 SLICE+2
7 STORE_FAST 0 (files)
10 LOAD_CONST 0 (None)
13 RETURN_VALUE
>>> dis.dis(func2)
2 0 LOAD_FAST 0 (files)
3 LOAD_CONST 1 (100)
6 SLICE+2
7 STORE_FAST 1 (new_files)
10 LOAD_CONST 0 (None)
13 RETURN_VALUE
在Python 3中也是一样的情况。
实际上,func1
可能会稍微快一点,因为名字 files
之前已经被使用过,可能已经在某个变量查找缓存中。
8
重复使用变量名在技术上没有什么坏处。不过,如果你重新使用一个变量并改变它的“用途”,可能会让其他阅读你代码的人感到困惑(尤其是他们没注意到这个变量被重新赋值了)。
在你提供的例子中,要明白当你进行切片操作时,实际上是生成了一个全新的列表。在旧的列表被垃圾回收机制清理之前,这个列表会在内存中存储两次(除了你切掉的部分)。一种替代方法是遍历这个列表,当你到达第batch_size
个元素时就停止,而不是遍历完整个列表,或者更简单地,你可以用del files[batch_size:]
来删除多余的部分。