Python字典引用赋值疑问:两段循环代码为何输出不同?
两段代码输出差异的核心原因
第一段代码的问题
你第一段代码里,set1 = {}只在循环外面执行一次,意味着整个过程中只有一个字典对象。每次循环里的set1[i[j][0]] = i[j][1]都是在修改这个唯一的字典,然后set2[i[0]] = set1只是把这个字典的引用(可以理解为指向它的地址)存到set2的对应键里。最后set2所有键指向的都是同一个字典,所以所有值自然都一样——因为最后一次循环把这个字典改完了,所有引用它的地方都会看到最终的结果。
第二段代码为什么正确
第二段代码把set1 = {}放到了循环内部,这意味着每轮循环都会新建一个全新的字典对象。每轮循环修改的都是当前这个新字典,然后把这个新字典的引用存到set2里。每个键对应的都是独立的字典,所以最终set2里的每个值都是各自对应的内容,符合你的预期。
关于你举的字典赋值例子的解释
你那个例子和第一段代码的操作完全不同:
dictionary1 = {} dictionary2 = {1:'a', 2:'b'} dictionary1 = dictionary2 # 让dictionary1指向dictionary2当前的对象 dictionary2 = {1:'f', 2:'g'} # 给dictionary2重新赋值一个全新的字典对象
注意,dictionary2 = {1:'f', 2:'g'}不是修改原来的字典,而是直接创建了一个新字典,然后让dictionary2指向这个新的。原来的{1:'a',2:'b'}并没有被改动,所以dictionary1依然指向原来的那个对象,两者自然互不影响。
而第一段代码里的操作是修改同一个字典对象的内容(比如给它加键值对、改值),不是重新赋值一个新对象,这才是核心区别。
内容的提问来源于stack exchange,提问作者user17907286
相关产品推荐
相关产品推荐

