python - 相等字符串自动更新(列表对象引用)

标签 python list object-reference

我最近参加了一次大学考试,有人问我这个程序的输出是什么:

def fun(x):
    y=x
    x.append(4)
    print(str(x)+" "+str(y))

fun(["one","two",3,5.0])

我回答说 y 列表将是 ["one","two", 3,5.0] 并且在将 4 附加到它之后,x 列表将是相同的但是有一个4 在它的末尾。令我惊讶的是,当我打印两个列表时,它们是相等的,即使 x 列表更新是在两个列表之间建立相等性之后执行的。为什么会这样?

谢谢

最佳答案

如果列出 x 到 y,您已经给出了引用。因此列表 x 中的任何更改也会影响列表 y。

y=x

例如:

>>> x = ["one","two",3,5.0]
>>> y = x
>>> x[3] = 4
>>> x
['one', 'two', 3, 4]
>>> y
['one', 'two', 3, 4]

这里 x 和 y 具有相同的标识。

>>> x is y
True
>>> id(x)
3073118540L
>>> id(y)
3073118540L

您可以使用 swampy 更好地理解这一点模块:

>>> from swampy.Lumpy import Lumpy
>>> lump = Lumpy()
>>> x = ["one","two",3,5.0]
>>> y = x
>>> x[3] = 4
>>> lump.object_diagram()

enter image description here


可以通过将列表 x 复制到列表 y 来实现您所期望的,如下所示:

>>> x = ["one","two",3,5.0]
>>> y = x[:]
>>> x.pop()
5.0
>>> x
['one', 'two', 3]
>>> y
['one', 'two', 3, 5.0]

因此,通过将内容从 x 复制到 y,它们不具有相同的身份:

>>> id(x)
3073240428L
>>> id(y)
3073240588L
>>> x is y
False

使用沼泽:

>>> from swampy.Lumpy import Lumpy
>>> lump = Lumpy()
>>> x = ["one","two",3,5.0]
>>> y = x[:]
>>> lump.draw_object()
>>> lump.object_diagram()

enter image description here

要获得更好的解释,请访问此处 How do I copy an object in Python?

关于python - 相等字符串自动更新(列表对象引用),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27738632/

相关文章:

python - 在 Matplotlib 的条形图上显示负值的问题

java - 包含实现该接口(interface)的类的对象的接口(interface)变量的引用对象是哪个?

java - 很难理解这个概念 : Threads communicate primarily by sharing access to fields and the objects reference fields refer to

Java:声明空构造函数以从另一个类初始化对象的替代方法

python - 读取多个 csv 文件(大小 mxm)并加载为 n 维数组(大小 nxmxm)(不连接)

Python - 使用格式化程序作为参数转换为字符串

python - Django ImageField 默认值

python - for循环,分割字符串,将部分字符串保存到新列表,IndexError : list index out of range - works for one part of string and not the other

python - 创建不是同一个列表的空白列表的字典

list - 将 putStr 应用于列表的每个项目