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

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

概述我刚刚在 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)))>>> 我刚刚在 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 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 – 为什么更新元组中的集会导致错误?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1195105.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-03
下一篇 2022-06-03

发表评论

登录后才能评论

评论列表(0条)

保存