深入理解Python中的变量、对象、赋值和可变性
最近学习Pyhon,联想到之前学习的Java、SQL时,有些新体会,在此聊一聊。
Python中一个知识点:变量和对象。变量指向对象,或者说变量就是对象的名字,类似SQL中的AS。
Python中另一个知识点:可变对象和不可变对象。可变对象修改时,会影响它的所有变量;不可变对象不可修改,当从变量角度修改时,会创建一个新的对象,然后将变量指向新对象。
在本文中:
- 变量=变量名=对象别名
- 值=对象
知识
变量可以指向一个对象。
多个变量可以指向同一个对象。
变量可以被重新赋值。
变量之间的赋值,从来都不会复制数据,只是将变量和对象联系起来。
不可变对象无法修改,从变量角度修改时,实际是创建了一个新对象。
可变对象的修改,会影响所有指向它的变量。
列表中元素引用(例如nums[1]),本质都是变量。
Python 是动态类型的,变量没有类型。任何变量在任何时候都可以引用任何值。变量可以引用一个整数,然后引用一个字符串,然后引用一个函数,然后引用一个模块。
正如变量没有类型一样,值也没有作用域。当我们说函数有局部变量时,我们的意思是该变量的作用域为该函数:您不能在函数外部使用该变量,并且当函数返回时,该变量将被销毁。如果变量的值有其他引用,它将在函数调用之外继续存在。
案例
将列表[1, 2, 3] 修改为 [10, 20, 30]。可能会这么写:
以上代码不起作用。因为在第一次迭代中,x 是nums[0]的值的别名。正如之前介绍的,当您有两个变量指向同一个值且值是不可变对象的时候,修改其中一个变量,另一个变量不会更改。回到这个案例,第一次迭代中,for循环中x指向1,1属于数字类型、不可变对象。循环体内,修改x时,会创建一个10,然后x指向10,但 nums[0] 仍然指向旧值 1。
最好的建议是避免改变列表,而是创建新列表:nums = [ 10*x for x in nums ]