关于python词典

关于python词典,python,dictionary,Python,Dictionary,我的问题是: 我有一个python函数,它接受一个字典和一个字符串作为输入。此词典将字符串作为键,列表作为值。在函数字典中,列表被更改-在值中的第一个空列表被命中之前,条目在使用时被删除。对于一次运行,它工作得很好,但是当这个函数处于For循环中时,只更改输入字符串并使用相同的字典,每次迭代都会更改原始输入字典。这是尽管在功能上的第一步,我创建了一个新的字典,设置它等于输入,并对新字典进行所有更改。你能告诉我怎么了吗?为什么原始词典会受到影响?当我在for-loop-before函数中创建一个新

我的问题是: 我有一个python函数,它接受一个字典和一个字符串作为输入。此词典将字符串作为键,列表作为值。在函数字典中,列表被更改-在值中的第一个空列表被命中之前,条目在使用时被删除。对于一次运行,它工作得很好,但是当这个函数处于For循环中时,只更改输入字符串并使用相同的字典,每次迭代都会更改原始输入字典。这是尽管在功能上的第一步,我创建了一个新的字典,设置它等于输入,并对新字典进行所有更改。你能告诉我怎么了吗?为什么原始词典会受到影响?当我在for-loop-before函数中创建一个新列表并将这个新列表作为输入传递时,我也得到了同样的结果

下面是一个实际代码:

#reading an input file 
x=open('graph .txt')
data=[line.strip() for line in x.readlines()]

gr=[s.split(' -> ') for s in data]

#creating a graph 
graph={}

for i in gr:
    graph[i[0]]=list(i[1])

for val in graph.values():
    if ',' in val:
        val = val.remove(',')
cycle=[]

nums=graph.keys()

# function changing dictionary 
def path(start,graph):
    cycle=[]
    graph111=graph
    cycle.append(start)
    while graph111[start]!=[]:
        move=graph111[start]
        if move==[]:
            break
        if len(move)>1:
            n=''.join(move[0])
            start=n
            cycle.append(n)
        else:
             p=''.join(move)
             start=p
             cycle.append(p)
        move.remove(move[0])
    return ('->'.join(cycle))
# for loop:
for num in nums:
    c=path(num,graph)
    cycles.append(c) 
输入如下所示:

 0 -> 3
 1 -> 0
 2 -> 1,6
 3 -> 2
 4 -> 2
 5 -> 4
 6 -> 5,8
 7 -> 9
 8 -> 7
 9 -> 6
def do_smth(dc):
    new_dict = dc
    new_dict['haha']='hohoho'

this_dict={}
do_smth(this_dict)

您不是通过python中的赋值创建新列表或字典:

>>> a=[1,2,3]
>>> b=a
>>> b[1]=5
>>> b
[1, 5, 3]
>>> a
[1, 5, 3]
要复制列表,可以使用切片表示法:

>>> c=a[:]
>>> c
[1, 5, 3]
>>> a[1]=10
>>> a
[1, 10, 3]
>>> c
[1, 5, 3]
有关词典,请参阅。
有关更复杂的数据类型和一般提示,请参见

如果没有实际代码,很难理解您的问题中发生了什么,但让我猜一下:您有这样的问题:

 0 -> 3
 1 -> 0
 2 -> 1,6
 3 -> 2
 4 -> 2
 5 -> 4
 6 -> 5,8
 7 -> 9
 8 -> 7
 9 -> 6
def do_smth(dc):
    new_dict = dc
    new_dict['haha']='hohoho'

this_dict={}
do_smth(this_dict)
然后您会看到,
这条命令已被更改。这是因为在调用函数时,您传递了对
此dict
的引用,因此您的函数能够修改
此dict
。另外请注意,该作业不会复制,因此
new_dict=ds
对您没有帮助。您必须编写
new\u dict=ds.copy()
来制作副本。此外,如果字典中有其他可变对象作为值,
.copy()
是不够的:您需要使用
copy.deepcopy()
,请参阅


您可以阅读详细信息(俄语)。

请包括实际代码。如果您发布了代码的相关部分……您可以省去这一大段的麻烦。复制字典是不够的。字典里的列表也需要复制。尝试
copy.deepcopy
,例如
mydictcopy=copy.deepcopy(mydict)
“我创建了一个新的字典,将其设置为输入”你能告诉我们你是怎么做的吗?我添加了一个代码问题
D.copy()->D的浅拷贝。。。这是不够的。还需要一个deepcopy来复制内部列表。@tdelaney,你可能是对的,但是如果没有代码,我不确定。不过,我会根据您的评论更新答案。我在问题中添加了一个代码。我想在for循环中使用的函数。你是对的,这与我的意图相似。非常感谢。Deepcopy是我在这里需要的。