python - 改变一个扭曲的列表 : whats going on behind the scenes

标签 python list

在 python 中,您可以像这样更改列表:

In [303]: x = [1,2,3,4,5,6]

In [304]: x[x <= 3]+=3

In [305]: x
Out[306]: [4, 2, 3, 4, 5, 6]

我知道这件事已经有一段时间了,但我不认为我完全理解幕后发生的事情。如果有人愿意花时间解释,我会很感激。

In [307]: x = [1,2,3,4,5,6]

In [308]: dis.dis('x[x <= 3]+=3')
          0 SETUP_LOOP      30811 (to 30814)
          3 SLICE+2        
          4 STORE_SUBSCR   
          5 DELETE_SUBSCR  
          6 SLICE+2        
          7 DELETE_SLICE+1 
          8 FOR_ITER        15659 (to 15670)
         11 DELETE_SLICE+1 

In [309]: x
Out[309]: [1, 2, 3, 4, 5, 6]

In [310]: x[x <= 3]+=3

In [311]: x
Out[311]: [4, 2, 3, 4, 5, 6]

In [312]: x<=3
Out[312]: False

In [313]: x[False]+=3

In [314]: x
Out[314]: [7, 2, 3, 4, 5, 6]

最佳答案

x <= 3是一个 bool 表达式。由于在 Python 中,boolean type 是 int 的子类, False结果被解释为 0 ,所以最终效果为:

x[0] += 3

或者,以不同的方式演示:

>>> False == 0
True
>>> True == 1
True
>>> isinstance(False, int)
True

dis.dis()方法不适用于字符串;它适用于代码对象(或包含代码的对象,例如函数、方法、类或模块)或字节码。它似乎能够解码您的字符串这一事实是一个快乐的巧合; SETUP_LOOP是操作码 120(x 的 ASCII 值),整个字符串被解释为一组操作码和偏移量。

改用函数:

>>> def foo(): x[x <= 3]+=3
... 
>>> dis.dis(foo)
  1           0 LOAD_GLOBAL              0 (x)
              3 LOAD_GLOBAL              0 (x)
              6 LOAD_CONST               1 (3)
              9 COMPARE_OP               1 (<=)
             12 DUP_TOPX                 2
             15 BINARY_SUBSCR       
             16 LOAD_CONST               1 (3)
             19 INPLACE_ADD         
             20 ROT_THREE           
             21 STORE_SUBSCR        
             22 LOAD_CONST               0 (None)
             25 RETURN_VALUE        

关于python - 改变一个扭曲的列表 : whats going on behind the scenes,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12922706/

相关文章:

python - 警告 :0 terminating async callback error in cv2

php - 在数据库中的逗号列表中查找特定值

c++ - 如何指向链表中的下一个节点并打印值

python - python 列表指向行为

python - 使用 Pandas,如何对两列使用 if/then 逻辑来填充另一列?

python - 从 PDF 中提取文本

python - 即使在发生错误后继续 python 脚本

python - 将 MariaDB 与 Django 1.10 和 Python 3.5 一起使用

android - 遍历列表以查找权限

java - 如何从 LinkedHashMap 获取 key