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