gpt4 book ai didi

python - 为什么更新元组中的集合会导致错误?

转载 作者:太空宇宙 更新时间:2023-11-03 12:22:31 24 4
gpt4 key购买 nike

我刚刚在 Python 2.6 中尝试了以下操作:

>>> foo = (set(),)
>>> foo[0] |= set(range(5))
TypeError: 'tuple' object does not support item assignment
>>> foo
(set([0, 1, 2, 3, 4]),)
>>> foo[0].update(set(range(10)))
>>> foo
(set([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]),)

我有几个问题:

  • 为什么 foo[0] |= set(range(5)) 更新集合并抛出异常?
  • 为什么 foo[0].update(set(range(10))) 可以正常工作?它不应该和第一条语句有相同的结果吗?

编辑 许多人指出,元组是不可变的。我知道这一点。他们还指出,|= 会创建一个新的 set 对象并将其分配给元组。那是错的。看这个:

>>> foo = set()
>>> bar = foo
>>> foo is bar
True
>>> foo |= set(range(5))
>>> foo
set([0, 1, 2, 3, 4])
>>> bar
set([0, 1, 2, 3, 4])
>>> foo is bar
True

这意味着没有创建新对象,但修改了现有对象。这应该与元组一起使用。另请注意,尽管我的第一个代码抛出 TypeError,但元组中的集合仍会更新。这就是我感兴趣的效果。为什么 TypeError,明明操作是成功的?

最佳答案

>>> def f():
... x = (set(),)
... y = set([0])
... x[0] |= y
... return
...
>>> import dis
>>> dis.dis(f)
2 0 LOAD_GLOBAL 0 (set)
3 CALL_FUNCTION 0
6 BUILD_TUPLE 1
9 STORE_FAST 0 (x)

3 12 LOAD_GLOBAL 0 (set)
15 LOAD_CONST 1 (0)
18 BUILD_LIST 1
21 CALL_FUNCTION 1
24 STORE_FAST 1 (y)

4 27 LOAD_FAST 0 (x)
30 LOAD_CONST 1 (0)
33 DUP_TOPX 2
36 BINARY_SUBSCR
37 LOAD_FAST 1 (y)
40 INPLACE_OR
41 ROT_THREE
42 STORE_SUBSCR

5 43 LOAD_CONST 0 (None)
46 RETURN_VALUE

这表明语句x[0] |= y 是通过调用x[0].__ior__(y) 然后将返回值赋给x[0]

set 通过让 set.__ior__ 返回 self 实现就地 |=。但是,对 x[0] 的赋值仍然发生。它分配已经存在的相同值这一事实无关紧要;它失败的原因相同:

x = (set(),)
x[0] = x[0]

失败。

关于python - 为什么更新元组中的集合会导致错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3492216/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com