python 变量赋值,引用,初始化问题
2017-03-30 19:53
525 查看
可变数据类型,与不可变数据类型
Python中所有变量都是值的引用,也就说变量通过绑定的方式指向其值。 而这里说的不可变指的是值的不可变。 对于不可变类型的变量,如果要更改变量,则会创建一个新值,把变量绑定到新值上,而旧值如果没有被引用就等待垃圾回收。不可变的类型还有一个特性,就是可以计算其hash值,这样才能进一步作为字典的key。可变类型数据对对象操作的时候,不需要再在其他地方申请内存,只需要在此对象后面连续申请(+/-)即可,也就是它的address会保持不变,但区域会变长或者变短。
可变类型包括:list dict
http://www.cnblogs.com/vamei/archive/2012/07/10/2582795.html:::
变量和它所指的对象的分离,就是动态类型的核心。由于变量只类似于一个指针,所以它可以随时指向一个新的对象,即使这个新的对象的类型发生了变化。
动态类型是Python的核心机制之一。可以在应用中慢慢熟悉。
总结:
变量和对象的分离,对象是内存中储存数据的实体,变量指向对象。
可变对象,不可变对象
函数值传递
是指向同一个内存地址的,python的赋值是只是把变量的内存地址赋值给另一个变量,这一点可以使用python的内建方法id()来进行测试,对于你给的例子: 我们假设'QH'这个字符串在内存中的地址是a,'LJQ'在内存中的地址是b you='QH' #让you变量指向a地址 me=you #让me变量和you变量一样指向a地址 you='LJQ' #修改you变量,让它指向到b地址 print you #可想而知you指向的是b地址,所以它的值为'LJQ' print me #me指向的是a地址,所以它的值为'QH' 输出: LJQ QH 可以使用ID来加强对python的赋值机制的理解 >>> a = 'asdf' >>> id(a) 872552384 >>> b = a >>> id(b) 872552384 >>> c = 'asdf' >>> id(c) 872552384 >>> a = 'haha' >>> id(a) 872552672 >>> id(b) 872552384 >>> a 'haha' >>> b 'asdf'
指向同一个内存地址. 但是即使是这样说,实际上还是有两种不同的理解 python变量分两种 mutable immutable, 就是可变和不可变的意思 数字,字符串 tuple (就是“()”这种形式的数组), 这种数据类型是不可变的, 因此 你以上的程序的含义是 you 指向 'QH', me指向you指向的内容, 所以me 就指向了'QH', 然后 you指向'LJQ', 这里是you本身的值变了, 而不是you指向的对象的值变了。 you=[1] me=you you.append(2) print you print me 输出 [1, 2] [1, 2] 这里, 你看到 you.append(2), 这其实是you指向的 [1]对象进行了append()操作,因此是该对象本身发生了变化([],{}以及其他大部分数据类型都是可变数据类型), 因此 me 和 you都指向同一个对象, 输出自然就是相同的。
Python中所有变量都是值的引用,也就说变量通过绑定的方式指向其值。 而这里说的不可变指的是值的不可变。 对于不可变类型的变量,如果要更改变量,则会创建一个新值,把变量绑定到新值上,而旧值如果没有被引用就等待垃圾回收。不可变的类型还有一个特性,就是可以计算其hash值,这样才能进一步作为字典的key。可变类型数据对对象操作的时候,不需要再在其他地方申请内存,只需要在此对象后面连续申请(+/-)即可,也就是它的address会保持不变,但区域会变长或者变短。
不可变类型包括:int string float tuple
可变类型包括:list dict
http://www.cnblogs.com/vamei/archive/2012/07/10/2582795.html:::
变量和它所指的对象的分离,就是动态类型的核心。由于变量只类似于一个指针,所以它可以随时指向一个新的对象,即使这个新的对象的类型发生了变化。
动态类型是Python的核心机制之一。可以在应用中慢慢熟悉。
总结:
变量和对象的分离,对象是内存中储存数据的实体,变量指向对象。
可变对象,不可变对象
函数值传递
相关文章推荐
- python 变量赋值,引用,初始化问题
- 关于C/C++中switch语句case中变量不能初始化赋值的问题
- 指针与引用的初始化&顶层底层const变量初始化问题
- python中将函数赋值给变量时需要注意的一些问题
- 【日常小坑】关于python3操作数据库实用占位符传入引用变量问题,做个Mark(python学习第一天)
- 成员变量赋值问题【向前引用】
- c++ 数组,变量,指针,引用, 初始化,赋值
- python之局部变量引用赋值前的结果
- Python中变量赋值传递时的引用和拷贝
- 深入理解Python中变量赋值的问题
- openoffice跨平台编程中的代码统一问题(临时变量赋值给引用问题)
- Python和Ruby中each循环引用变量问题(一个隐秘BUG?)
- C++中一般变量、引用变量、常量、 静态变量、静态常量的初始化问题
- 解析Python中的变量、引用、拷贝和作用域的问题
- go和python变量赋值遇到的一个问题
- Python中变量传递时的引用和赋值
- Python和Ruby中each循环引用变量问题(一个隐秘BUG?)
- C#变量初始化问题:字段初始值无法引用非静态字段、方法或属性
- python 变量赋值引用的一点学习笔记
- python类初始化参数赋值,实例直接调用append函数后,导致所有实例中变量改动