加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

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

发布时间:2020-12-20 12:37:14 所属栏目:Python 来源:网络整理
导读:我刚刚在 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,4,5,6,7,8,9]),) 我在这里有几个问题: 为
我刚刚在 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,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,4])
>>> bar
set([0,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 sets in-place | =设置.__ ior__返回self.但是,仍然会对x [0]进行分配.它分配已经存在的相同值的事实是无关紧要的;它失败的原因相同:

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

失败.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读