python记不住代码_为什么Python要在[不记得系列]中更改列表“y”和列表“x”?,记不住,之,python,也,会...

本文解释了Python中变量如何引用对象,特别是对于可变和不可变对象的区别。当对可变对象如列表进行操作时,会直接修改原对象,而不可变对象如整数在进行类似操作时会创建新对象。了解这一概念有助于避免编程中的常见错误,例如意外地改变列表。此外,文章提到了使用is和id()检查对象是否相同的重要性,并讨论了增强赋值运算符在不同对象类型上的行为差异。
摘要由CSDN通过智能技术生成

https://docs.python.org/zh-cn/3/faq/programming.html#why-did-changing-list-y-also-change-list-x

如果你编写的代码就像下面一样:

>>> x = []

>>> y = x

>>> y.append(10)

>>> y

[10]

>>> x

[10]

你可能想知道为什么追加一个元素也改变了x。

产生这种结果有两个因素:

变量只是指向具体对象的名称。 执行 y = x 并不会为列表创建一个副本 —— 它只是创建了一个新变量 y 指向 x 所指向的同一对象。 这意味着只存在一个对象(列表),x 和 y 都是对它的引用。

列表属于 mutable 对象,这意味着你可以改变它的内容。

mutable – 可变

可变对象可以在其 id() 保持固定的情况下改变其取值

immutable – 不可变

具有固定值的对象。不可变对象包括数字、字符串和元组。这样的对象不能被改变。如果必须存储一个不同的值,则必须创建新的对象。它们在需要常量哈希值的地方起着重要作用,例如作为字典中的键。

在调用 append() 之后,这个可变对象的内容由 [] 变为 [10]。 由于两个变量都指向同一对象,因此使用任何一个名称所访问到的都是修改后的值 [10]。

如果我们改为将不可变对象赋值给 x:

>>> x = 5 # ints are immutable

>>> y = x

>>> x = x + 1 # 5 can't be mutated, we are creating a new object here

>>> x

6

>>> y

5

我们可以看到在此情况下 x 和 y 就不再相等了。 这是因为整数是 immutable 对象,当我们执行 x = x + 1 时我们并不是改变了 5 这个对象的值;而是创建了一个新的对象 (整数 6) 并将其赋值给 x (也就是改变了 x 所指向的对象)。 在赋值之后我们就有了两个对象 (整数 6 和 5) 以及分别指向它们的两个变量 (x 现在指向 6 而 y 仍然指向 5)。

某些操作 (例如 y.append(10) 和 y.sort()) 是

改变原对象

,而看上去相似的另一些操作 (例如 y = y + [10] 和 sorted(y)) 则是

创建新对象

。 通常在 Python 中 (以及在标准库的所有代码中) 会改变原对象的方法将返回 None 以帮助避免混淆这两种不同类型的操作。 因此如果你错误地使用了 y.sort() 并期望它将返回一个经过排序的 y 的副本,你得到的结果将会是 None,这将导致你的程序产生一个容易诊断的错误。

但是,还存在一类操作,不同的类型执行相同的操作会有不同的行为:那就是

增强赋值运算符

。 例如,+= 会原地改变列表,但不会改变元组或整数 (a_list += [1, 2, 3] 与 a_list.extend([1, 2, 3]) 一样都会改变 a_list,而 some_tuple += (1, 2, 3) 和 some_int += 1 则会创建新的对象)。

换而言之:

如果我们有一个

可变对象 (list, dict, set 等等)

,我们可以使用某些特定的操作来改变它,所有指向它的变量都会显示它的改变。

如果我们有一个

不可变对象 (str, int, tuple 等等)

,所有指向它的变量都将显示相同样的值,但凡是会改变这个值的操作将总是返回一个新对象。

如果你想知道两个变量是否指向相同的对象,你可以使用 is 运算符,或内置函数 id()。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值