Python并行赋值是否真同步?以LeetCode矩阵旋转为例
Python并行赋值交换元素的底层原理
首先得明确Python里这种并行赋值的执行流程是分两步走的,根本不会出现你担心的“先修改一个值污染另一个源值”的问题:
- 先计算右侧所有值:执行赋值语句时,Python会先把等号右边的所有表达式(也就是
matrix[i][j]和matrix[j][i])的结果都算出来,打包成一个临时元组保存起来。比如这两个位置的值分别是a和b,右侧就会先得到(a, b)这个元组,而且这个元组里的a和b都是原始的、未被修改的值。 - 再给左侧依次赋值:等右侧所有值都确定并保存好之后,Python才会把临时元组里的元素按顺序赋值给左侧的对应位置。也就是先把a赋值给
matrix[j][i],再把b赋值给matrix[i][j]。
- 先计算右侧所有值:执行赋值语句时,Python会先把等号右边的所有表达式(也就是
举个具体的例子:假设转置前
matrix[i][j] = 3,matrix[j][i] = 5,执行matrix[j][i], matrix[i][j] = matrix[i][j], matrix[j][i]时:- 右侧先读取到3和5,生成临时元组
(3,5); - 然后把3赋值给
matrix[j][i],把5赋值给matrix[i][j],完成交换。
- 右侧先读取到3和5,生成临时元组
这种写法本质上和你用temp临时变量的逻辑完全一致,只是Python帮你把“保存原始值”的步骤封装成了语法糖,不用手动声明temp变量而已。
内容的提问来源于stack exchange,提问作者user1330974
相关产品推荐
相关产品推荐

