python - 序列解包是原子的吗?

标签 python variable-assignment atomic

序列拆包是原子的吗?例如:

(a, b) = (c, d)

我的印象是它不是。

编辑:我指的是多线程上下文中的原子性,即整个语句是否像原子曾经那样不可分割。

最佳答案

这是一个操作;在应用左侧赋值之前评估右侧表达式:

>>> a, b = 10, 20
>>> a, b
(10, 20)
>>> b, a = a, b
>>> a, b
(20, 10)
>>> a, b = a*b, a/b
>>> a, b
(200, 2)

或者,如果您谈论的是多线程环境,那么赋值不是原子的;解释器使用单个操作码评估元组赋值,但使用单独的操作码将结果存储到每个受影响的变量中:

>>> def t(self): a,b=20,20
... 
>>> dis.dis(t)
  1           0 LOAD_CONST               2 ((20, 20))
              3 UNPACK_SEQUENCE          2
              6 STORE_FAST               1 (a)
              9 STORE_FAST               2 (b)
             12 LOAD_CONST               0 (None)
             15 RETURN_VALUE        

然而,正常赋值总是至少有两个操作码(一个用于右侧表达式,一个用于存储结果),所以在 python 中一般 分配不是原子的。序列解包也不异常(exception)。

关于python - 序列解包是原子的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13649684/

相关文章:

python - 通过属性获取字符串内容

java - Java 中使用数组和引用类型的别名

javascript - Javascript 的 __defineSetter__ 的奇怪行为

python - 将格式应用于整行 Openpyxl

python - Pygame 的矩形不移动?

python - tensorflow 2.0 : Accessing a batch's tensors from a callback

Javascript变量初始化语法

atomic - kubernetes apiserver “the server could not find the requested resource”

c - 在 malloc 的结构中初始化原子标志

c++ - IPC 通过 mmap 文件 : should atomics and/or volatile be used?