这里有一些简化的代码,我不明白为什么它不工作。
from collections import namedtuple
MyStruct = namedtuple('MyStruct', 'ThreadInstance ThreadName Mnemonic IpAddr IpGW Status Mode')
Node = MyStruct(None, '', '', '', '', -1, 0)
NodeDb = []
for id in range(4):
NodeDb.append(Node)
NodeDb[2]._replace(ThreadName='T2')
NodeDb[2]._replace(Mnemonic='ABCD')
NodeDb[2]._replace(IpAddr='192.0.1.2')
NodeDb[2]._replace(IpGW='192.0.1.3')
NodeDb[2]._replace(Status=0)
NodeDb[2]._replace(Mode=2)
print(NodeDb)
这是输出
'>>>
[MyStruct(ThreadInstance=None, ThreadName='', Mnemonic='', IpAddr='', IpGW='', Status=-1, Mode=0),
MyStruct(ThreadInstance=None, ThreadName='', Mnemonic='', IpAddr='', IpGW='', Status=-1, Mode=0),
MyStruct(ThreadInstance=None, ThreadName='', Mnemonic='', IpAddr='', IpGW='', Status=-1, Mode=0),
MyStruct(ThreadInstance=None, ThreadName='', Mnemonic='', IpAddr='', IpGW='', Status=-1, Mode=0)]'
_replace
并不像你想象的那样。从docs:您正在调用
_replace
,但从未存储它返回的新Node
。它返回一个新对象而不是改变对象的“就地”是因为namedtuples
在定义上是不可变的,也就是说,它们在您创建之后是不能改变的。请注意,您的
for
循环将创建一个包含对同一Node
的四个引用的列表。在本例中,这并不是一个真正的问题,因为您创建的对象都是相同的,并且namedtuple
是不可变的,但是通常要注意这一点。总而言之:
请记住,用C语言来说,列表中的每一项都像一个指针一样工作。Python变量总是由引用传递和使用。也就是说,这是真的:
我认为您需要一个单独对象的列表,在这种情况下,您应该将
Node = MyStruct(...)
移动到for循环中。相关问题 更多 >
编程相关推荐