簡體   English   中英

NamedTuple 跨變量共享

[英]NamedTuple is shared across variables

from typing import NamedTuple, List, Set, Tuple, Dict

class EmbeddingInfoStruct(NamedTuple):
    emb_names : list[str] =[]
    idx_in_data: list[int] =[]
    emb_dim: list[int] =[]

info1 =EmbeddingInfoStruct()
info1.emb_names.append("name1")

info2=EmbeddingInfoStruct()

print("info1 address = ", id(info1), ", info2 address = " ,id(info2))
print (info1)
print (info2)

打印 output:

info1 address =  2547212397920 , info2 address =  2547211152576
EmbeddingInfoStruct(emb_names=['name1'], idx_in_data=[], emb_dim=[])
EmbeddingInfoStruct(emb_names=['name1'], idx_in_data=[], emb_dim=[])

令人驚訝的是 info1 和 info2 都共享相同的值。 我希望 info2.emb_names 為空。 為什么 NamedTuple 表現得像一個“靜態類”?

我認為您誤認為NamedTuple來自typing模塊,描述了用於類型提示目的的命名元組的類型,以及您可以從collection package 中的 namedtuple( namedtuple()獲得的命名元組(請參閱集合文檔)。

在這里,您實際上是在更改EmbeddingInfoStruct的 class 成員,因此是“靜態類”行為。


使用這個,你的 class 聲明更像是

from collections import namedtuple
EmbeddingInfoStruct = namedtuple("EmbeddingInfoStruct",["emb_names", "idx_in_data", "emb_dim"],defaults=[list(),list(),list()])

info1 = EmbeddingInfoStruct()

但是,您可能會陷入“可變”的陷阱,默認為 arguments 如此處所述

正如其他人所說,問題是可變的默認值。 您可以使用帶有提供默認工廠的字段的數據類。

https://docs.python.org/3/library/dataclasses.html#dataclasses.field

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM