1

Hitchhiker's Guide to Python指出重用变量名是件好事。

foo = Spam()
bar = foo.eggs()

我同意。它使代码可读。

如果变量是 40 MB 的数据怎么办?它会复制自己并总共有 80 MB 吗?

foo = buffer  # 40 MB.
bar = foo.resize((50, 50))  # +40?

我知道当函数执行时内存会被释放,但我仍然不认为仅仅因为可读性而在一个应用程序状态下使用两倍高的内存使用量是一个好主意。这就像一个特例,但另一方面,特例还不够特别,对吧?

4

2 回答 2

6

Python 赋值只是将引用值复制到目标对象。没有数据复制。Python 变量只是 Python 系统字典中的名称加上作为对象引用值的值。

实际上,你应该小心分配。任何 Python 赋值都意味着共享参考值。Python 赋值从不意味着复制目标对象。使用字符串或数字等不可变对象时,不会出现任何问题。但是,当您分配任何可变对象(列表、字典、集合、某些用户对象)时,您应该知道之后您只是给目标对象一个不同的名称(通过引用值的另一个副本访问)。

将对象作为函数/方法参数传递也是如此。

于 2012-11-12T08:25:57.760 回答
4

如果您在调整数据大小之前绝对必须将该数据完全保存在内存中(而不是只读取您关心的位),您可以这样做:

foo = buffer()
bar = foo.resize((50, 50))
del foo

或等效地:

bar = buffer().resize((50, 50))

buffer一旦运行此代码,这两者都会使结果立即可用于垃圾收集。

此外,在这种情况下重用变量名是完全合理的——如果代码中的行是一个接一个,特别是如果foo.resize返回与 foo 相同类型的对象(看起来如此),那么:

foo = buffer
foo = foo.resize((50, 50))

很好。建议不要为完全不相关的变量重用名称——这样阅读您的代码的人就可以看到该变量,然后直接跳到第一次分配它的位置以了解它是什么。当其中一个只是获得您关心的实际对象的一次性“垫脚石”时,混淆读者的风险很小。

于 2012-11-12T08:43:42.930 回答