Python正则表达式子

时间:2017-04-29 17:46:29

标签: python regex substitution

所以我遇到了一些我无法解释的事情,希望有人可以解释......这是我的代码:

fd = open(inFile, 'r')
contents = fd1.readlines()
fd.close()
contentsOrig = contents
contents[3] = re.sub(replaceRegex, thingToReplaceWith, contentsOrig[3])

现在,当我打印出内容和内容时,它们完全一样。我试图保留我最初阅读的内容,但是从这个小代码中它似乎并没有起作用。谁能开导我?

我正在运行Python 2.7.7

2 个答案:

答案 0 :(得分:0)

在Python中,不能以复制它们的方式复制可变对象。如果有效,则x = y仅将x和y设置为内存中的相同地址 - 它们引用相同的对象(在本例中为列表)。如果您使用ID函数id(x)id(y),它们实际上是相同的! 修改:请注意下面的海报显示x is y; is关键字在后台使用id函数。

这里有一个更简单的例子:

list_one = [1, 2, 3]
list_two = list_one
list_one.append(4)
print list_one        #will show [1, 2, 3, 4], as expected
print list_two        #will ALSO show [1, 2, 3, 4]!

在这种情况下,要解决此问题,您可以使用列表拼接来创建新列表:

new_list = original_list[:]

如果您有多个嵌套列表(或其他可变对象),那么您可以使用deepcopy模块制作副本,如果您还希望复制所有嵌套列表。

答案 1 :(得分:0)

是的,当您将列表分配给另一个变量时,它不是该列表的副本,而是一个参考。意思是该列表仍然有一个副本,现在两个变量都指向它。

contentsOrig = contents
contentsOrig is contents
# Result: True

当您更改其中一个值或修改列表时,它正在更改相同的列表。所以你需要做的是复制一份清单。这可以通过以下方式之一完成:

contentsOrig = contents[:]

contentsOrig = list(contents)

第一种方法是使用列表切片从头到尾生成一个新列表。第二个采用列表并返回列表的新副本。

请注意,两种方式都不会在列表中创建项目的新副本。所以它是相同的项目,但不同的容器。但由于这些是字符串,因此它们不可变,因此如果在列表中进行修改,原始字符串将在原始列表中不受影响。