变量存储在内存中的值。这就意味着在创建变量时会在内存中开辟一个空间。基于变量的数据类型,解释器会分配指定内存,并决定什么数据可以被存储在内存中。
1.变量的定义
js中需要用let
、const
、var
关键字来声明,如在js定义一个局部变量let name = '张三'
。 在java中定义变量需要声明变量的类型,go语言也一样。但是在python中变量定义不需要关键字声明,也不需要声明类型。
变量的命名规则:
- 系统关键字 不能用在变量中
- 变量名由数字、字母、下划线组合,但是首字符不能是数字。
>>> count = 100
>>> type(count)
<class 'int'>
>>> name = '张三'
>>> type(name)
<class 'str'>
>>> tu = (1,2,3,4)
>>> type(tu)
<class 'tuple'>
>>> li = [1,2,3,4,5]
>>> type(li)
<class 'list'>
>>> aset = {1,2,3,'hell'}
>>> type(aset)
<class 'set'>
>>> di = {'name':'张三','age':19}
>>> type(di)
<class 'dict'>
2.多个变量赋值
>>> a, b, c = 1, 2, "john"
>>> a, b, c = 1, 2, "john"
3.值类型和引用类型
值类型
:对象本身不允许修改,数值的修改实际上是让变量指向了一个新的对象 包含:字符串、元组、数值,本身不允许被修改
引用类型
:对象本身可以修改 包含:列表、字典,本身允许修改
值类型
>>> a = 1
>>> a +=2
>>> a
3
小伙伴在看了上面的定义,阅读了代码肯定就有疑问了,a
变量中初始值是1,在自身加2后,变量a
值变成了3,a
的值发生了改变,怎么就不允许修改,这不明明改变了吗?针对小伙伴这个疑问,小菜用下面代码来解释一下
>>> a = 1
>>> id(a)
1471308976
>>> a +=2
>>> id(a)
1471309008
>>> a
3
小菜将上面代码重复了一遍,不同的是在每次运算完后添加了一行id(a)
。在本小节开始的时候小菜记得写过变量存储在内存中的值。这就意味着在创建变量时会在内存中开辟一个空间
。当我们定义一个变量a
,python就会在内存中为变量a
开辟一块内存空间,让变量a
来存储值。id
的作用就是打印变量a
在内存中的地址,可以看到当a=1
时,a
在内存中的地址是1471308976
,当我们在对a +=2
时,a
在内存中的地址1471309008
。变量a
在内存中的地址发生了改变。
过程演示 a = 1
为变量a
分配内存空间,存储地址1471308976
,存放值1
, a +=2
重新分配一块内存,存储地址是1471309008
,存放值3
,内存释放原来a
变量,将1471309008
内存重新命名变量a
。
引用类型
>>> user = {'name':'张三','age':18}
>>> user['name'] = '王五'
>>> user
{'name': '王五', 'age': 18}
这样一看好像看不出和上面到底有什么区别,将上面代码改一下,打印一下它们在内存中的地址
>>> user = {'name':'张三','age':18}
>>> id(user)
6150160
>>> user['name'] = '王五'
>>> id(user)
6150160
>>> user
{'name': '王五', 'age': 18}
这样看着就明白许多了,变量user
修改前后在内存中的地址都是6150160
,没有发生改变。值类型
和引用类型
的本质区别就是对象的本身是否可以被修改。小菜在下面写一个例子
值类型的例子
>>> a = 1
>>> b = a
>>> a = 2
>>> a
2
>>> b
1
引用类型的例子
>>> auser = {'name':'张三','age':19}
>>> buser = auser
>>> auser['name'] = '隔壁老王'
>>> auser
{'name': '隔壁老王', 'age': 19}
>>> buser
{'name': '隔壁老王', 'age': 19}
值类型
和引用类型
最基本的分别在复制之后的结果。当一个值类型被复制的时候,相当于创造了一个完全独立的实例,这个实例保有属于自己的独有数据,数据不会受到其他实例的数据变化影响
值类型
就好像身份证复印件一样,复印出来之后,修改原件上面的内容,复印件上的内容不会变。复制一个引用类型
的时候,实际上是默默地创造了一个共享的实例分身,两者是共用一套数据。因此修改其中任何一个实例的数据,也会影响到另外那个。