我的问题是: 我在python中有一个函数,它将字典和字符串作为输入。此字典将字符串作为键作为列表作为值。在函数字典中,列表已更改 - 在使用条目时将其删除,直到达到值中的第一个空列表。对于一次运行,它运行良好,但是当此函数在for循环中仅更改输入字符串并使用相同的字典时,每次迭代都会更改原始输入字典。这是在第一步的功能,我创建一个新的字典设置它等于输入并在该新字典上进行所有更改。你能告诉我一些什么是错的吗?为什么原始词典受到影响?当我在函数之前在for循环中创建一个新列表并将此新列表作为输入传递时,我也得到了相同的结果。
这是一个实际的代码:
#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
答案 0 :(得分:1)
您不是通过python中的赋值创建新列表或字典:
GridViews
要复制列表,可以使用切片表示法:
>>> a=[1,2,3]
>>> b=a
>>> b[1]=5
>>> b
[1, 5, 3]
>>> a
[1, 5, 3]
对于字典,请参阅Deep copy of a dict in python。 有关更复杂的数据类型和一般提示,请参阅https://docs.python.org/2/library/copy.html
答案 1 :(得分:1)
如果没有实际的代码,很难理解你的问题中发生了什么,但让我猜一下:你有这样的事情:
def do_smth(dc):
new_dict = dc
new_dict['haha']='hohoho'
this_dict={}
do_smth(this_dict)
然后您会看到this_dict
已更改。这是因为您在调用函数时传递了对this_dict
的引用,因此您的函数可以修改this_dict
。另请注意,该作业不会复制,因此new_dict = ds
对您没有帮助。你必须写new_dict = ds.copy()
来制作副本。此外,如果您的词典中有其他可变对象作为值,.copy()
是不够的:您需要使用copy.deepcopy()
代替this question。
您可以阅读详细信息here(俄语)。