python 中那些有趣的细节

最近看程序,发现连很多最基本的都没有搞清楚


1关于变量值, for循环中的变量i相当于进行了n次赋值,在结束循环语句后依旧会保持最后的赋值.
i = 0
for i in range(6):
	pass
print(i)

结果

5
2. 关于变量的赋值

Python的变量赋值更像是对象的引用,类似于指针,而不是直接复制,由此相当于把a的对象的引用赋值给了b,b对原引用的更改会直接影响a因为a和b的引用的"指针"一致

a = [1,2,3]
b = a
b.append(7)
print(b)
print(a)

结果

[1,2,3,7]
[1,2,3,7]
3. b +=[5] 本质上不等于 b = b+[5]

可以发现, 虽然 b+= 与 b = b+ 对于b的结果没有影响,但是却对a的结果产生了影响

a = [1,2,3]
b = a
b +=[5]
print(b)
print(a)
b = b + [7]
print(b)
print(a)

结果

[1,2,3,5]
[1,2,3,5]
[1,2,3,5,7]
[1,2,3,5]

为了说明为什么,这里使用内置函数id()进行检查, id()的官方说明:

id(object)
Return the “identity” of an object. This is an integer which is guaranteed to be unique and constant for this object during its lifetime. Two objects with non-overlapping lifetimes may have the same id() value.
CPython implementation detail: This is the address of the object in memory.

>>> a = [1,2,3]
>>> b = a
>>> b +=[5]
>>> b
[1, 2, 3, 5]
>>> a
[1, 2, 3, 5]
>>> id(b)
140523625748488
>>> id(a)
140523625748488
>>> b = b+[5]
>>> b
[1, 2, 3, 5, 5]
>>> a
[1, 2, 3, 5]
>>> id(b)
140523625748744
>>> id(a)
140523625748488

b表明了b这个变量指向了某一存储地址, b+= 是在本来存储地址对应的存储空间基础上添加了一个单位,所以b的指向存储地址"指针"不变
b =b + 更像是b对应的地址内存与新数据做加法之后,生成了一个新的数据空间,这新的内存地址所对应的指针重新赋值给 b,因此b代表的内存地址不一样了,并且与a不再指向同一地址,a与b的联系"切断"了

4.关于变量类型对赋值的影响

对于int float 或者 str,这种,只要类型相同,内存地址就相同,数变了,连带着的地址也会变,所以a b 就没有"相连"

a = c = 1
b = a
print(id(a))
print(id(b))
print(id(c))
b +=1
c = c+0
print(b)
print(a)
print(id(b))
print(id(a))
print(id(a))
94873508389760
94873508389760
94873508389760
2
1
94873508389792
94873508389760
94873508389760
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值