使用python csv模块更新列表中的变量

时间:2012-10-11 08:08:57

标签: python csv python-2.7

这就是我所拥有的:

import csv

a=8   
print a    
mylist = [a,'2','3']    
myfile = open("myfile.csv", "wb") # csv files should always be opened in binary mode 
wr = csv.writer(myfile, quoting=csv.QUOTE_ALL)    
wr.writerow(mylist)    
a = a + 1    
print a    
wr.writerow(mylist)

打印结果为89,正如我所料。当我打开我创建的文件时,我得到了结果:

"8","2","3"     
"8","2","3"

第一行是我期望的,但第二行以"8"而不是"9"开头。我知道我可以通过在重新定义变量后再次插入mylist = [a,'2','3']来解决这个问题,但有人会介意向我解释为什么我必须重新插入列表行或为什么变量不会在列表中自动更新?我可以使用另一种方法来避免每次要更新变量时重新插入列表行吗?

2 个答案:

答案 0 :(得分:2)

这是一行:

a = a + 1

您将a重新分配给新的整数,该整数未与之前的值相关联。

无论如何,整数是不可变的变量,除了重新分配之外你不能做任何其他事情。

作为@ thg435注释,列表操作some_list = some_list + [5]会产生相同的效果。但是,列表是可变对象,您可以使用some_list.append(5),这将修改列表并将其更改反映到csv文件中。

如果使用可变对象(list,dict),则可以修改它们的值:

import csv
a=8   
mylist = [a,'2','3']    
with open("myfile.csv", "wb") as myfile:
    wr = csv.writer(myfile, quoting=csv.QUOTE_ALL)    
    wr.writerow(mylist)    
    mylist[0] = mylist[0] + 1  ####  here you modify a list
    wr.writerow(mylist)

答案 1 :(得分:0)

考虑

a = 1
mylist = [a,2,3]
print mylist # [1,2,3]

mylist是一个包含三个元素的结构,其中第一个元素指向变量a,其值为1

----------       -------------
| mylist | --->  |   |  2|  3|
----------       -------------
                   |
                   v   
                 -----      -----
                 | a | ---> | 1 |
                 -----      -----

现在让我们改变a

   a = a + 1
   print mylist # still [1,2,3]

我们创建了一个 new 变量,并将其命名为a,从而从第一个变量中撤消该名称。列表的第一个元素仍然指向第一个(现在)未命名的)变量。这两个变量没有任何关系。

----------       -------------
| mylist | --->  |   |  2|  3|
----------       -------------
                   |
                   v   
                 -----      -----
                 | ? | ---> | 1 |
                 -----      -----

-----      -----
| a | ---> | 2 |
-----      -----