Python 为什么每次迭代都要更新所有映射值?

Python 为什么每次迭代都要更新所有映射值?,python,python-3.x,sqlalchemy,flask-sqlalchemy,Python,Python 3.x,Sqlalchemy,Flask Sqlalchemy,我正在尝试创建一个方法,该方法可以接受任意数量的sqlalchemy模型,并确定它们是否具有相同的属性。该方法还接受cols\u to\u ignore,这是一个表示要忽略的列名的字符串数组 为此,我使用模型的属性创建一个映射,并迭代每个模型,将每个列值添加到我存储为映射中的值的集合中。然后,映射被返回到另一个方法,该方法检查任何给定映射值的长度是否为1,这表示所有属性都相同,或者多个属性表示提交的模型具有不同的属性值 我遇到的问题是,代码当前更新每个键的值,而不仅仅是具有特定列名的键 例如,使

我正在尝试创建一个方法,该方法可以接受任意数量的sqlalchemy模型,并确定它们是否具有相同的属性。该方法还接受
cols\u to\u ignore
,这是一个表示要忽略的列名的字符串数组

为此,我使用模型的属性创建一个映射,并迭代每个模型,将每个列值添加到我存储为映射中的值的集合中。然后,映射被返回到另一个方法,该方法检查任何给定映射值的长度是否为1,这表示所有属性都相同,或者多个属性表示提交的模型具有不同的属性值

我遇到的问题是,代码当前更新每个键的值,而不仅仅是具有特定列名的键

例如,使用以下模型运行代码(这里用json表示)
{birthMonth:'January',birthYear:1990},{birthMonth:'March',birthYear:1990}
应该会产生以下映射:

{'birthMonth':{一月、三月},'birthYear':{1990}

但结果却是:

{'birthMonth':{1990年1月,3月},出生年份:{1990年1月,3月}

这是我的密码:

def具有相同的属性(cols到ignore,*模型):
如果不是所有同一型号:
raise VALUERROR('模型类型必须全部匹配')
属性\映射=dict.fromkeys(模型[0]。\表\列.键(),集())
对于模型中的模型:
对于模型中的键。\u表\u.columns.keys():
如果输入cols\u以忽略:
持续
属性映射[key].add(getattr(model,key))
返回属性映射
对于属性_map.values()中的值:
如果(长度(值)>1):
返回错误
返回真值
all\u same\u model(models)
验证提交给该方法的所有模型是否属于同一类型


我觉得这很简单,我没有看到,但我已经做了一段时间,现在没有运气。感谢您的帮助。

这是常见的
[[]]*10
错误的一个变体:
dict.fromkeys
使用提供的单个对象作为每个键的值,因此只有一个
集正在更新。(它如何知道如何重新创建一个“相似的”
集合
对象?

根据Davis Herring提供的答案,我能够重构代码,以避免使用dict.fromkeys方法并使其工作。这是现在可以使用的更新代码

def have_same_attributes(cols_to_ignore, *models):
    if not all_same_model(models):
        raise ValueError('Types of models must all match')
    attribute_map = dict()
    for key in models[0].__table__.columns.keys():
        if key in cols_to_ignore:
            continue
        attribute_map[key] = set()
    for model in models:
        for key in model.__table__.columns.keys():
            if key in cols_to_ignore:
                continue
            attribute_map[key].add(getattr(model, key))
            if(len(attribute_map[key])>1):
                return False
    return True

return attribute\u map
似乎位于错误的位置,因为下面的循环从未执行过。