瞎老猛 2022-04-09 10:38 采纳率: 100%
浏览 40
已结题

python collections namedtuple模块的迷思

赋值覆盖不了的问题

from collections import namedtuple

# namedtuple('名称', [属性list]):
Point = namedtuple('Point', ['x', 'y', 'z'])
p = Point('x', 'y', 'z')
print(p)
Point.x=8
p=Point(4,3,2)
print(p.x, p.y, p.z,p)

img


结果跟想像的不一样
用Point.x来赋值就把p.x的值锁定住了
再用p=Point()来赋值就覆盖不掉了

  • 写回答

3条回答 默认 最新

  • ash062 2022-04-10 00:57
    关注

    看了namedtuple的源码,大概知道是怎么回事了。。。
    单看下面这段

        for index, name in enumerate(field_names):
            try:
                itemgetter_object, doc = cache[index]
            except KeyError:
                itemgetter_object = _itemgetter(index)
                doc = f'Alias for field number {index}'
                cache[index] = itemgetter_object, doc
            class_namespace[name] = property(itemgetter_object, doc=doc)
    
        result = type(typename, (tuple,), class_namespace)
    

    题中p = Point(4, 3, 2)创建时,p.x, p.y和p.z并非实例属性,而是Point中修饰过的property object
    大概意思就是求p.x时,该方法继承于Point,调用Point.x,即返回传入p的第0个对象,当Point.x被赋值为8后,p.x的调用仍按此路线走,所以返回了8,造成类属性覆盖实例属性的现象

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 4月10日
  • 已采纳回答 4月10日
  • 创建了问题 4月9日

悬赏问题

  • ¥15 keil里为什么main.c定义的函数在it.c调用不了
  • ¥50 切换TabTip键盘的输入法
  • ¥15 可否在不同线程中调用封装数据库操作的类
  • ¥15 微带串馈天线阵列每个阵元宽度计算
  • ¥15 keil的map文件中Image component sizes各项意思
  • ¥20 求个正点原子stm32f407开发版的贪吃蛇游戏
  • ¥15 划分vlan后,链路不通了?
  • ¥20 求各位懂行的人,注册表能不能看到usb使用得具体信息,干了什么,传输了什么数据
  • ¥15 Vue3 大型图片数据拖动排序
  • ¥15 Centos / PETGEM