0

我想在接受用户输入的字典中的字典中输入数据。这是我的代码:

n= int(raw_input("Enter no of customers:"))

d={}
d1={}
d2={}

for i in range(n):
    print "Enter Details for customer-{}".format(i+1)
    s="Customer-{}".format(i)
    #print s
    #print type(s)
    d1["Name"]=raw_input("Enter Name:")
    d1["Phone"]=long(raw_input("Enter Phone:"))
    d1["Tab"]=float(raw_input("Enter Tab:"))

    d2["Address-1"]=raw_input("Enter Address-1:")
    d2["Address-2"]=raw_input("Enter Address-2:")
    d2["State"]=raw_input("Enter State:")

    d1["Address"]=d2    

    d[s]=d1
    #print d

print d


for k,v in d.iteritems():
    print k

    for k1,v1 in d1.iteritems():
        if k1=="Address":
        print "\tAddress:"

        else:
            print "\t",k1,":",v1

    for k2,v2 in d2.iteritems():
        print "\t\t",k2,":",v2

只是我面临的问题是它覆盖了数据,我无法理解为什么。

输出如下:

Customer-1
Phone : 433
Name : ggg
Tab : 433.0
Address:
State : 434
Address-2 : 443
Address-1 : 4343

Customer-0
Phone : 433
Name : ggg
Tab : 433.0
Address:
State : 434
Address-2 : 443
Address-1 : 4343

Customer-2
Phone : 433
Name : ggg
Tab : 433.0
Address:
State : 434
Address-2 : 443
Address-1 : 4343

请,任何帮助表示赞赏!

4

1 回答 1

1

您需要在循环中创建一个新字典:

d={}

for i in range(n):
    d1={}
    d2={}

否则,您将继续分配相同的对象并在循环中一遍又一遍地更改它。

您只是在 中存储对现有字典的引用d,而不是副本。您可以创建对字典的多个引用,并且通过所有这些引用可以看到任何更改:

>>> foo = {}
>>> bar = foo
>>> foo['eggs'] = 'ham'
>>> bar
{'eggs': 'ham'}
>>> foo['eggs'] = 'spam'
>>> bar
{'eggs': 'spam'}

该表达式d[s]=d1d1在给定键 in 下存储对 的引用d,并且所有这些引用都指向同一个对象。通过将d1 = {}d2 = {}行移动到循环中,您可以在每次迭代中创建字典。

确保创建对新字典的引用的另一种方法是使用dict.copy()方法创建它的副本,但最好在此处创建新字典。

您可能还想给变量起更好的名称;而不是d,d1d2, 也许你想使用customers,customeraddress代替。

于 2013-08-30T11:25:53.840 回答