python array赋值_从踩坑学Python内部原理(5):执行时机的差异

(给Python开发者加星标,提升Python技能)

英文:Satwik Kansal,翻译:暮晨

Python开发者整理自 GitHub

【导读】:Python 是一个设计优美的解释型高级语言,它提供了很多能让程序员感到舒适的功能特性。但有的时候 Python 的一些输出结果对于初学者来说似乎并不是那么一目了然。

GitHub 有个仓库收集 Python 中那些难以理解和鲜为人知的功能特性,并尝试讨论这些现象背后真正的原理!

虽然有些例子并不一定会让你觉得“卧槽”(WTF),但它们依然有可能会告诉你一些你所不知道的 Python 有趣特性。我觉得这是一种学习编程语言内部原理的好办法,而且我相信你也会从中获得乐趣!

如果你是一位经验比较丰富的 Python 程序员,你可以尝试挑战看是否能一次就找到例子的正确答案。你可能对其中的一些例子已经比较熟悉了,那这也许能唤起你当年踩这些坑时的甜蜜回忆。

执行时机的差异

1.

array = [1, 8, 15]
g = (x for x in array if array.count(x) > 0)
array = [2, 8, 22]

Output:

>>> print(list(g))
[8]

2.

array_1 = [1,2,3,4]
g1 = (x for x in array_1)
array_1 = [1,2,3,4,5]

array_2 = [1,2,3,4]
g2 = (x for x in array_2)
array_2[:] = [1,2,3,4,5]

Output:

>>> print(list(g1))
[1,2,3,4]

>>> print(list(g2))
[1,2,3,4,5]
说明
  • 在生成器[1]表达式中, in 子句在声明时执行, 而条件子句则是在运行时执行.
  • 所以在运行前, array 已经被重新赋值为 [2, 8, 22], 因此对于之前的 1, 815, 只有 count(8) 的结果是大于 0 的, 所以生成器只会生成 8.
  • 第二部分中 g1g2 的输出差异则是由于变量 array_1array_2 被重新赋值的方式导致的.
  • 在第一种情况下, array_1 被绑定到新对象 [1,2,3,4,5], 因为 in 子句是在声明时被执行的, 所以它仍然引用旧对象 [1,2,3,4](并没有被销毁).
  • 在第二种情况下, 对 array_2 的切片赋值将相同的旧对象 [1,2,3,4] 原地更新为 [1,2,3,4,5]. 因此 g2array_2 仍然引用同一个对象(这个对象现在已经更新为 [1,2,3,4,5]).

参考资料

[1]

生成器: https://wiki.python.org/moin/Generators


- EOF -

推荐阅读   点击标题可跳转

1、从踩坑学Python内部原理(4):for 循环怎么会事儿?

2、从踩坑学Python内部原理(3):对象那点事儿

3、卧槽!Python还有这些特性(2):奇怪的字典

觉得本文对你有帮助?请分享给更多人

推荐关注「Python开发者」,提升Python技能

bdc4075f0040745627f00590554bb50b.png

点赞和在看就是最大的支持❤️

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值