最近看程序,发现连很多最基本的都没有搞清楚
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