如何解决这种在列表中交换值的方式是否在 Python 中使用了额外的内存?
交换列表中值的常用方法是使用临时变量。
temp = l[i]
l[i] = l[j]
l[j] = temp
但是在python中你可以这样做:
l[i],l[j] = l[j],l[i]
第二种方法是如何工作的?它是完全相同的过程吗?它使用更少/更多内存吗?
解决方法
import dis
def swap_using_temp(a,b):
temp = a
a = b
b = temp
def swap_using_unpacking(a,b):
a,b = b,a
swap_using_unpacking
不需要额外的内存。
说明:
如果您使用所描述的两个函数的 dis
模块反汇编代码,那么您将看到在 swap_using_unpacking
中有一个字节码指令 ROT_TWO
,它交换堆栈的 2 个最顶部元素(不'不需要第三个变量,因此不会消耗额外的内存)。
dis.dis(swap_using_unpacking)
11 0 LOAD_FAST 1 (b)
2 LOAD_FAST 0 (a)
4 ROT_TWO
6 STORE_FAST 0 (a)
8 STORE_FAST 1 (b)
10 LOAD_CONST 0 (None)
12 RETURN_VALUE
dis.dis(swap_using_temp)
5 0 LOAD_FAST 0 (a)
2 STORE_FAST 2 (temp)
6 4 LOAD_FAST 1 (b)
6 STORE_FAST 0 (a)
7 8 LOAD_FAST 2 (temp)
10 STORE_FAST 1 (b)
12 LOAD_CONST 0 (None)
14 RETURN_VALUE
,
你在这里问错了问题。您使用的不是汇编语言而是 Python,因此您不必担心一些额外的字节。 Python 中真正重要的是可读性。
无论如何,两个版本的内部实现方式应该或多或少相同,只是第一个版本创建了一个额外的标识符。它被明确命名为 temp
,因此只要您不在该范围内使用它,它就不会带来真正的问题。
如果您使用 linting 环境来警告您可能出现的问题(您应该做什么...),您必须注意重用在外部作用域中隐藏相同名称的变量名称,虽然在语言上完全正确,但会发出一些警告。但由于您不应在本地范围(可读性...)之外使用 temp
标识符,因此也不应该成为问题。
所以这更像是一个品味问题。如果您或您的团队成员经常使用不允许多次分配的其他语言,则第一种方式会更自然。如果你主要使用 Python,第二种方法是恕我直言更多 pythonic 因为它避免在本地范围内添加不必要的标识符。但正如我已经说过的,没有什么比品味的问题了......
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。