给变量以数据,而不是给数据以变量
变量不存在实体,它仅仅是一个标签,一旦赋值就被设置到另一个物体上,不变的是那些物体,即‘对象’。python中所有的东西都是对象,包括函数、类、模块,甚至字符串‘hello',数字1,2,3都是对象。
多看几个例子就明白了~
例:
a=1
b=2
c=1
a=b
a和c指向同一个对象整数1,给a赋值b后,a指向2。1和c都不受影响。
例:
a = 1
print('a', a, id(a))
b = 2
print('b', b, id(b))
c = 1
print('c', c, id(c))
# 再次赋值
a = b
print('a', a, id(a))
输出:
a 1 4301490544
b 2 4301490576
c 1 4301490544
a 2 4301490576
id() 可以认为是获取一个对象的地址。可以看出,a 和 c 开始其实是同一个地址,而后来赋值之后,a 又和 b 是同一个地址。每次给变量重新赋值,它就指向了新的地址,与原来的地址无关了。
例:
a = [1,2,3]
print('a', a, id(a))
b = a
print('b', b, id(b))
b[1] = 5
print('a', a, id(a))
print('b', b, id(b))
输出:
a [1, 2, 3] 4490723464
b [1, 2, 3] 4490723464
a [1, 5, 3] 4490723464
b [1, 5, 3] 4490723464
b 赋值为 a 后,和 a 指向同一个列表对象。[1] 这个基于 index 的赋值是 list 对象本身的一种操作,并没有给 b 重新贴标签,改变的是对象本身。所以 b 指向的还是原来的对象,此对象的改动自然也会体现在 a 身上。