在Python中重用变量

8 投票
4 回答
13799 浏览
提问于 2025-04-17 11:53

在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:]来删除多余的部分。

撰写回答