瞎老猛 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 目详情-五一模拟赛详情页
  • ¥15 有了解d3和topogram.js库的吗?有偿请教
  • ¥100 任意维数的K均值聚类
  • ¥15 stamps做sbas-insar,时序沉降图怎么画
  • ¥15 unity第一人称射击小游戏,有demo,在原脚本的基础上进行修改以达到要求
  • ¥15 买了个传感器,根据商家发的代码和步骤使用但是代码报错了不会改,有没有人可以看看
  • ¥15 关于#Java#的问题,如何解决?
  • ¥15 加热介质是液体,换热器壳侧导热系数和总的导热系数怎么算
  • ¥100 嵌入式系统基于PIC16F882和热敏电阻的数字温度计
  • ¥15 cmd cl 0x000007b