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))更新集合并抛出异常? 编辑许多人都指出,元组是不可改变的.我知道这一点.他们还指出,| =会创建一个新的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] 失败. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |