我是自学的(目前没有教过的部分),所以如果这个问题是愚蠢的或不言自明的,我很抱歉。我似乎无法以找到同一主题的现有查询的方式来表达该问题,所以无论如何。
在以下(脱离上下文的)代码片段中,我找不到输出应该不同的原因:
set1 = {}
for i in s1:
for j in range(1,len(i)):
set1[i[j][0]] = i[j][1]
set2[i[0]] = set1
...还有...
for i in s1:
set1 = {}
for j in range(1,len(i)):
set1[i[j][0]] = i[j][1]
set2[i[0]] = set1
...其中 s1 是结构为
[name, [value, pair] [value, pair]]
的列表列表,所需输出为 {name: {value: pair, value:pair}, name2: ...}
我知道如果不能保证 s1 中的每个列表都具有表示的所有相同值,则无论如何第二种方法都是必要的。我不明白为什么第一种方法返回一个字典,其中每个名称(键)的所有值都相同,当对 set1 的不同值执行
set2[i[0]] = set1
时
我知道原因与Python传递引用而不是数据副本有关...我不明白为什么在执行类似操作时似乎不一样:
dictionary1 = {}
dictionary2 = {1:'a', 2:'b'}
dictionary1 = dictionary2
dictionary2 = {1:'f', 2:'g'}
...其中,dictionary1 被提供为dictionary2 的副本,并且在整个过程中与它无关如有任何帮助,我们将不胜感激。再次,如果重复或愚蠢,抱歉
l = [1, 2, 3, 4]
d = {'hello': l}
print(d) # Out: {'hello': [1, 2, 3, 4]}
l[3] = -1
print(d) # Out: {'hello': [1, 2, 3, -1]}
这是因为l[3] = -1
操作维护了指针。然而:
l = [1, 2, 3, 4]
d = {'hello': l}
print(d) # Out: {'hello': [1, 2, 3, 4]}
l = 24
print(d) # Out: {'hello': [1, 2, 3, 4]}
在第二个示例中,操作l=24
不适用于指针,而是“分离
l
的指针”并创建一个新对象
l
,在本例中它现在是一个整数。在您的示例中,会发生类似的情况,其中
set = {}
有点“分离”当前位于
set1
中的前一个
set2
的引用与您在此循环迭代中拥有的对象
set1
的引用。但是,仅执行
set1[i[j][0]] = i[j][1]
不会产生这样的分离,并且您将访问
set2
中的对象。