在Python的for循环中,是否有原因覆盖dictionary2的值,其中前面提到的“dictionary1=dictionary2”也更新了dict1?

问题描述 投票:0回答:1

我是自学的(目前没有教过的部分),所以如果这个问题是愚蠢的或不言自明的,我很抱歉。我似乎无法以找到同一主题的现有查询的方式来表达该问题,所以无论如何。

在以下(脱离上下文的)代码片段中,我找不到输出应该不同的原因:

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 的副本,并且在整个过程中与它无关

如有任何帮助,我们将不胜感激。再次,如果重复或愚蠢,抱歉

python dictionary for-loop
1个回答
0
投票
一般来说,Python 字典通过引用或指针工作。但这也取决于您对我们指向的对象应用什么样的操作。 示例:

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
 中的对象。

© www.soinside.com 2019 - 2024. All rights reserved.