python: 变量、别名、标记、相等性
变量:
python变量最好把它们理解为附加在对象上的标注,变量不是对象,而是标注。
>>>a = [1, 2, 3]
>>>b = a
>>>a.append(4)
>>>b
[1, 2, 3, 4]
上述示例中a和b引用了同一个列表,而不是列表的副本。
为了理解python赋值变量的语句,应该从右开始读,对象在右边创建或获取,之后左边的变量才会绑定到对象上,这就像为对象贴标注。
别名、标识:
>>>charles = {'name': Charles, 'born': 1978}
>>>lewis = charles
>>>lewis is charles
True
>>>id(charles), id(lewis)
(4300473992, 4300473992)
>>>lewis['balance'] = 950
>>>charles
{'name': Charles, 'balance': 950, 'born': 1978}
>>>alex = {'name': Charles, 'balance': 950, 'born': 1978}
>>> alex == charles
True
>>>alex is charles
False
上述示例中,lewis和charles为别名, 即两个变量绑定在同一个 对象上,alex不是charles的别名,因为alex绑定在新创建的对象上。
每个变量都有标识,类型和值。对象一旦创建,它的标识是不会变化的,可以把标识理解为内存地址。
上述示例中通过is运算符比较两个对象的标识, id () 函数返回对象标识的整数部分。
由于lewis和charles为同一个对象的引用,因此其标识相同,alex为新对象的引用,虽然值相等,但是标识仍不同。
相等性:
==运算符比较的是两个对象的值(对象中保存的数据),而is比较的是对象的标识。
元组的相对不变性:
元组中保存到是对象的引用, 元组的不变性指的是元组数据结构的物理内存(即保存的引用)的不变性,与引用的对象无关。
>>>t1 = (1, 2, [3, 4])
>>>t2 = (1, 2, [3, 4])
>>>t1 == t2
True
>>> id(t1[-1])
4302515784
>>> t1[-1].append(5)
>>>t1
(1, 2, [3, 4, 5])
>>> id(t1[-1])
4302515784
元素的值会随着引用的对象的变化而变化,元组中不变的是元素的标识。