素材牛VIP会员
求问Python的一个列表赋值问题
 威***军  分类:Python  人气:877  回帖:6  发布于6年前 收藏

为什么

s = [1, 2, 3, 4, 5, 6]
i = 0
i = s[i] = 3
结果是: [1, 2, 3, 3, 5, 6] 而不是 [3, 2, 3, 4, 5, 6]

 标签:python

讨论这个帖子(6)垃圾回帖将一律封号处理……

Lv1 新人
编***魔 职业无 6年前#1

可使用 PythonTutor.com
i = s[i] = 3 那一行基本上就是先後執行i=3 及s[i]=3

Lv1 新人
闪***星 UI设计师 6年前#2

看结果反推,是i=3 在 s[i] = 3之前执行了。

你就分开两句写不行吗?

Lv6 码匠
好***下 职业无 6年前#3

i = s[i] = 3 等价于 i = 3; s[i] = 3

用dis模块来解析执行过程:

>>> def f():
    s = [1, 2, 3, 4, 5, 6]
    i = 0
    i = s[i] = 3

    
>>> import dis
>>> dis.dis(f)
  2           0 LOAD_CONST               1 (1)
              3 LOAD_CONST               2 (2)
              6 LOAD_CONST               3 (3)
              9 LOAD_CONST               4 (4)
             12 LOAD_CONST               5 (5)
             15 LOAD_CONST               6 (6)
             18 BUILD_LIST               6
             21 STORE_FAST               0 (s) # s = [1, 2, 3, 4, 5, 6]

  3          24 LOAD_CONST               7 (0)
             27 STORE_FAST               1 (i) # i = 0

  4          30 LOAD_CONST               3 (3) # 常量3 入栈
             33 DUP_TOP                        # 复制栈顶,也就是 常量3
             34 STORE_FAST               1 (i) # i = 3
             37 LOAD_FAST                0 (s)
             40 LOAD_FAST                1 (i)
             43 STORE_SUBSCR                   # s[i] = 3
             44 LOAD_CONST               0 (None) # 返回 None
             47 RETURN_VALUE

分开写的例子

>>> def f2():
    s = [1, 2, 3, 4, 5, 6]
    i = 0
    i = 3
    s[i] = 3

    
>>> dis.dis(f2)
  2           0 LOAD_CONST               1 (1)
              3 LOAD_CONST               2 (2)
              6 LOAD_CONST               3 (3)
              9 LOAD_CONST               4 (4)
             12 LOAD_CONST               5 (5)
             15 LOAD_CONST               6 (6)
             18 BUILD_LIST               6
             21 STORE_FAST               0 (s) # s = [1, 2, 3, 4, 5, 6]

  3          24 LOAD_CONST               7 (0)
             27 STORE_FAST               1 (i) # i = 0

  4          30 LOAD_CONST               3 (3)
             33 STORE_FAST               1 (i) # i = 3

  5          36 LOAD_CONST               3 (3)
             39 LOAD_FAST                0 (s)
             42 LOAD_FAST                1 (i)
             45 STORE_SUBSCR                   # s[i] = 3
             46 LOAD_CONST               0 (None)
             49 RETURN_VALUE
>>> 
Lv1 新人
in***ex 职业无 6年前#4

可以参考下写过的一篇文章: Python: 链式赋值的坑

Lv1 新人
岛***疤 页面重构设计 6年前#5

根据 Assignment statements 可知:

a = b = c = d = ... = E

等同于

a = E
b = E
c = E
d = E
...

所以: i=s[i]=3等同于:

i = 3
s[i] = 3

Python 中的赋值是一个语句,并不是一个操作符,所以表达式(a=b)会产生语法错误,赋值语句没有值.

Lv3 码奴
二***了 交互设计师 6年前#6

参考 https://stackoverflow.com/que...

等同于

s = [1, 2, 3, 4, 5, 6]
i = 0
temp_value = 3
i = temp_value
s[i] = temp_value

首先是i变成了3,然后才赋值s[i]

 文明上网,理性发言!   😉 阿里云幸运券,戳我领取