>>> 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 barTrue>>> foo |= set(range(5))>>> fooset([0,4])>>> barset([0,4])>>> foo is barTrue
这意味着没有创建新对象,但现有对象已被修改.这应该与元组一起使用.另请注意,尽管我的第一个代码抛出了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]
失败.
总结以上是内存溢出为你收集整理的python – 为什么更新元组中的集会导致错误?全部内容,希望文章能够帮你解决python – 为什么更新元组中的集会导致错误?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)