关于python词典

时间:2015-12-26 21:20:35

标签: python dictionary

我的问题是: 我在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

2 个答案:

答案 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(俄语)。