[英]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.