繁体   English   中英

Python正则表达式子

[英]Python regular expression sub

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

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

现在,当我打印出contents和contentsOrig时,它们是完全相同的。 我试图保留我最初阅读的内容,但是从这个小代码看来似乎行不通。 谁能启发我?

我正在运行Python 2.7.7

在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模块进行复制。

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

contentsOrig = contents
contentsOrig is contents
# Result: True

当您更改一个值或修改列表中的任何一个时,它将更改同一列表。 因此,您需要做的就是复制列表。 这可以通过以下两种方式之一完成:

contentsOrig = contents[:]

要么

contentsOrig = list(contents)

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM