Python 2.7.13/3.6.1版结构更换不一致地更改原始字符串

2024-09-26 22:52:54 发布

您现在位置:Python中文网/ 问答频道 /正文

在python3文档中,结构更换描述如下:

str.replace(old, new[, count])

Return a copy of the string with all occurrences of substring old replaced by new. If the optional argument count is given, only the first count occurrences are replaced.

根据这个,代码

old = [['z','b']]
new = []
new.append(old[0])

print(old == new)

new[0][0] = old[0][0].replace('z','a')

print([old,new,old==new])

你应该回来

True
[[['z', 'b']], [['a', 'b']], False]

但是,在Python2和Python3中,它实际上返回:

True
[[['a', 'b']], [['a', 'b']], True]

这意味着old已经从[['z','b']]修改为[['a','b']],尽管文档暗示它不应该这样做。但是,这并不是文档措辞不好。旧的价值不是每次都改变。这取决于我们如何定义变量new。如果我们以一种不同但(似乎)等价的方式定义新的:

old = [['z','b']]
new = [['z','b']]

print(old == new)

new[0][0] = old[0][0].replace('z','a')

print([old,new,old==new])

我们得到输出:

True
[[['z', 'b']], [['a', 'b']], False]

这正是我们最初所期望的。在这两种情况下,在结构更换如果使用,则old==new的计算结果为True。然而,根据用于将变量new设置为[['z','b']]的方法,结构更换更改的值。你知道吗

Python如何“记住”new变量是如何定义的,并相应地更改其输出?Python如何知道两个等价的新变量之间有什么不同?不管怎样,为什么旧的价值在改变呢?不应该结构更换只是返回一个旧的修改过的副本,而不是实际更改它?你知道吗


Tags: ofthe文档falsetruenew定义count
1条回答
网友
1楼 · 发布于 2024-09-26 22:52:54

您不是.append(..)引用old的内容,而是old的引用-使用.copy().deepcopy()old上-然后您有两个不同的值,它们不引用同一个对象。你知道吗

基本上,在第一个用法中newold指向相同的数据,在第二个示例中,它们指向不同的数据。你知道吗

How to clone or copy a list?

相关问题 更多 >

    热门问题