Python正则表达式子类

Python正则表达式子类,python,regex,substitution,Python,Regex,Substitution,所以我遇到了一些我无法解释的事情,希望有人能解释清楚。。。这是我的密码: fd = open(inFile, 'r') contents = fd1.readlines() fd.close() contentsOrig = contents contents[3] = re.sub(replaceRegex, thingToReplaceWith, contentsOrig[3]) 现在,当我打印内容和内容时,它们是完全相同的。我试图保留我最初读到的内容,但从这个小代码来看,它似乎不起作用。

所以我遇到了一些我无法解释的事情,希望有人能解释清楚。。。这是我的密码:

fd = open(inFile, 'r')
contents = fd1.readlines()
fd.close()
contentsOrig = contents
contents[3] = re.sub(replaceRegex, thingToReplaceWith, contentsOrig[3])
现在,当我打印内容和内容时,它们是完全相同的。我试图保留我最初读到的内容,但从这个小代码来看,它似乎不起作用。谁能启发我


我在Python中运行Python2.7.7

,可变对象不能以您复制它们的方式复制。如果有效,则执行
x=y
仅将x和y设置为内存中的相同地址-它们引用相同的对象(在本例中为列表)。如果您使用ID函数
ID(x)
ID(y)
它们实际上是相同的! 编辑:注意下面的海报显示的
x是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模块进行复制。

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

contentsOrig = contents
contentsOrig is contents
# Result: True
当您更改其中一个值或修改任何中的列表时,它将更改相同的列表。所以你需要做的是复制一份清单。这可通过以下任一方式完成:

contentsOrig = contents[:]

第一种方法是使用列表切片从开始到结束生成一个新列表。第二个获取一个列表并返回该列表的新副本

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

contentsOrig = list(contents)