在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如何知道两个等价的新变量之间有什么不同?不管怎样,为什么旧的价值在改变呢?不应该结构更换只是返回一个旧的修改过的副本,而不是实际更改它?你知道吗
您不是
.append(..)
引用old
的内容,而是old
的引用-使用.copy()
或.deepcopy()
在old
上-然后您有两个不同的值,它们不引用同一个对象。你知道吗基本上,在第一个用法中
new
和old
指向相同的数据,在第二个示例中,它们指向不同的数据。你知道吗见How to clone or copy a list?
相关问题 更多 >
编程相关推荐