Python 压根就没有变量的概念。
用C或C++的变量概念去理解python就会一头雾水。
C、C++中的变量
C/C++中的变量的概念是面向内存的。
所以你要声明一个变量:表明空间大小,存储的格式(整数,浮点),以及一个永久不变的名字指向这个变量。
python只有name和object
a = 3这个语句中 a 是一个名字, 3 是一个object
这个语句其实并不是什么赋值
而是干了以下三件事创建name a
创建object 3
将name a 关联到 3这个object以后就可以用a来调用3这个object
所有name在创建时必须关联到一个object。
name可以在创建以后指向任何一个object(包括不同类型)。
所以name本身没有类别,他关联的object是有类别的。
在python中可以使用type(name)来查看name关联的object的类型。
进阶回答
Python的数据模型(参见手册章3)python所有的数据都用object(对象)表示
对象在创建时有以下属性标识,唯一识别,不可改变,通过id(obj)查看
类型,不可改变
值,根据类型形式分为mutable(可变),immutable(不可变)
Name(参见手册9.1 以及此文)
对象是用来使用的,比如参与表达式运算,或作为函数参数传递
python并不直接使用object,而是使用name的间接方式:将name关联到object,然后name就可以用在表达式。
一个object可以被多个name关联。
name总是存在于特定的namespace中
直观比喻:对象,就像一个人,出生时就分配身份证ID,这个终身不变。
人可以有不同的name(小明,儿子,父亲,老公)但在特定情境下(namespace)都指的是同一个人。
不同情境下(namespace),name可能指代不同人,比如每个家庭都有一个老公。
python语法 “=”的含义
C语言中的等号是赋值,而python中的等号大不相同
对于等号左边是单一目标的定义
1,name = object目标是indentifier(name)
将object关联到当前namespace,
如果当前namespace没有这个name就创建
2,mutable.attr=object目标是一个可变对象的属性
对象属性被修改为(或者说指向)object
这个与C中的把等号右边的值放入左边的存储空间的概念完全不同。其它的类型赋值语句可以自己看手册。
对象的可变与不可变
python奇特的可变数据numbers(整数,浮点,布尔等)不可变,对!不可修改
list,dict之类的容器类对象,是可变对象注意,容器实际存储的是对象的reference
可变是指reference可变,也就是可以把reference指向新的object
语法上a=list[0]返回的是list的0位置reference关联的object的值
list[0]=4,实际是将list的0位置reference改成关联到4这个对象
也就是说,python压根就不能直接修改基础对象的值,只能修改容器中的renference
几个小实验
这个测试中如果按C语言,对I存储空间赋值理解,id应该不变,但事实是变的
以python的name关联来理解,每个循环步骤,i关联到不同的数字object,所以ID不同
这个试验中修改list,0位置的中的值,导致0位置ID的变化
说明list存储的是reference,
这个试验中a在做加法后id变了,也就是不是同一个object了
这与C语言的赋值大不相同
python只有对象和name,基础的数据不可修改,所以在加法后创建了新的object用于存储结果,然后重新关联到name a
写在最后
相比C和C++语言,python的概念模型显得很特别。它让编程者,更关注与数据对象的操作,而不是数据存储。这使得编程者能快速的实现想法,而不过多专注于存储细节。
当然要使用好python,就要按它的思维方式去思考,这对于从C、C++这种以内存为基础的编程模式转换过来的人来说,可能是一个挑战。但你只要用python,name vs object的思维,很多疑惑都会消除。