Python中var = ({},) * 2与var = ({}, {})的区别解析
Python中
({},) * 2与({}, {})的本质区别 核心差异:引用复用 vs 独立对象创建
({},) * 2的本质:({},)是一个包含单个空字典对象的元组,*2操作仅会将元组内的元素引用重复两次——这里的「重复」没有创建新字典,只是复制了原字典的内存地址。最终元组里的两个元素指向的是内存中同一个字典。
解包赋值给dict_a和dict_b后,这两个变量其实是同一个字典的别名,修改其中一个,另一个会同步变化。({}, {})的本质:
这里的两个{}是两次独立的字典初始化操作,会生成两个完全独立的空字典对象(内存地址完全不同)。元组里的两个元素是不同的字典引用,解包后dict_a和dict_b指向各自的字典,修改其中一个不会影响另一个。
对应代码验证
代码1(返回True)
dict_a, dict_b = ({},) * 2 dict_a["anything"] = "whatever" print(dict_a == dict_b) # 输出True
解释:dict_a和dict_b指向同一个字典,修改dict_a的键值对后,dict_b对应的也是这个被修改后的字典,因此内容完全一致。
代码2(返回False)
dict_a, dict_b = ({}, {},) dict_a["anything"] = "whatever" print(dict_a == dict_b) # 输出False
解释:dict_a被修改为包含键值对的字典,而dict_b仍是初始的空字典,二者内容不同,因此返回False。
补充说明
Python中,序列(元组、列表)的*n操作对于可变对象(如字典、列表)只会复制引用,不会深拷贝对象。如果需要创建多个独立的可变对象,不要用*操作,而是显式创建多个实例(比如[{} for _ in range(2)])。
内容的提问来源于stack exchange,提问作者Overthinking Dumb Fellow
相关产品推荐
相关产品推荐

