Python中令人迷惑的4个引用

第二个:出人意料的is

下面是一个在互联网上非常有名的例子.

a = 256

b = 256

a is b

True

a = 257

b = 257

a is b

False

a = 257; b = 257

a is b

True

说明:

is 和 == 的区别

  • is 运算符检查两个运算对象是否引用自同一对象 (即, 它检查两个运算对象是否相同).

  • == 运算符比较两个运算对象的值是否相等.

因此 is 代表引用相同, == 代表值相等. 下面的例子可以很好的说明这点,

[] == []

True

[] is [] # 这两个空列表位于不同的内存地址.

False

256 是一个已经存在的对象, 而 257 不是

当你启动Python 的时候, 数值为 -5 到 256 的对象就已经被分配好了. 这些数字因为经常被使用, 所以会被提前准备好.

Python 通过这种创建小整数池的方式来避免小整数频繁的申请和销毁内存空间.

当前的实现为-5到256之间的所有整数保留一个整数对象数组, 当你创建了一个该范围内的整数时, 你只需要返回现有对象的引用. 所以改变1的值是有可能的. 我怀疑这种行为在Python中是未定义行为. 😃

id(256)

10922528

a = 256

b = 256

id(a)

10922528

id(b)

10922528

id(257)

140084850247312

x = 257

y = 257

id(x)

140084850247440

id(y)

140084850247344

这里解释器并没有智能到能在执行 y = 257 时意识到我们已经创建了一个整数 257, 所以它在内存中又新建了另一个对象.

当 a 和 b 在同一行中使用相同的值初始化时,会指向同一个对象.

a, b = 257, 257

id(a)

140640774013296

id(b)

140640774013296

a = 257

b = 257

id(a)

140640774013392

id(b)

140640774013488

  • 当 a 和 b 在同一行中被设置为 257 时, Python 解释器会创建一个新对象, 然后同时引用第二个变量. 如果你在不同的行上进行, 它就不会 “知道” 已经存在一个 257 对象了.

  • 这是一种特别为交互式环境做的编译器优化. 当你在实时解释器中输入两行的时候, 他们会单独编译, 因此也会单独进行优化. 如果你在 .py 文件中尝试这个例子, 则不会看到相同的行为, 因为文件是一次性编译的.

第三个:影子数组

我们先初始化一个变量row

row = [“”]*3 #row i[‘’, ‘’, ‘’]

并创建一个变量board

board = [row]*3

Output:

board

[[‘’, ‘’, ‘’], [‘’, ‘’, ‘’], [‘’, ‘’, ‘’]]

board[0]

[‘’, ‘’, ‘’]

board[0][0]

‘’

board[0][0] = “X”

board

[[‘X’, ‘’, ‘’], [‘X’, ‘’, ‘’], [‘X’, ‘’, ‘’]]

我们有没有赋值过3个 “X” 呢?

说明:

当我们初始化 row 变量时, 下面这张图展示了内存中的情况。

而当通过对 row 做乘法来初始化 board 时, 内存中的情况则如下图所示 (每个元素 board[0]board[1] 和 board[2] 都和 row 一样引用了同一列表.)

我们可以通过不使用变量 row 生成 board 来避免这种情况. (这个issue提出了这个需求.)

board = [[‘’]*3 for _ in range(3)]

board[0][0] = “X”

board

[[‘X’, ‘’, ‘’], [‘’, ‘’, ‘’], [‘’, ‘’, ‘’]]

第四个:混乱的输出

#python学习群592539176

funcs = []

results = []

for x in range(7):

def some_func():

return x

funcs.append(some_func)

results.append(some_func()) # 注意这里函数被执行了

funcs_results = [func() for func in funcs]

Output:

results

[0, 1, 2, 3, 4, 5, 6]

funcs_results

[6, 6, 6, 6, 6, 6, 6]
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Python工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Python开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

img

img

img

img

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以扫码获取!!!(备注:Python)

img-blog.csdnimg.cn/img_convert/6c361282296f86381401c05e862fe4e9.png)

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以扫码获取!!!(备注:Python)

  • 10
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值