python的的数据类型以及(值传递和引用传递)

一:python有两种数据类型:

  1. 可变数据类型(mutable object):列表可以通过引用其元素,改变对象自身(in-place change), 这种数据类型,称之为可变数据类型,词典也是这样的数据类型
  2. 不可变数据类型(immutable object):像数字和字符串,不能改变对象本身,只能改变引用的指向,称之为不可变数据类型,元组(tuple)尽管可以调用引用元素,但不可以赋值,因为不能改变对象本身,所以也是不可变数据类型
    is关键字:要想知道是否指向同一个对象,可以使用python中的is关键字,其是判断两个引用所指的对象是否相同
    ‘==’
    二:值传递和引用传递
    关于值传递和引用传递,综合目前各种的说法,可以得出这样的结论:可变对象为引用传递,不可变对象为值传递。但是python中一切事物均视为对象,个人觉得值传递和对象传递只不过是对象引用的两种表现。如果是可变对象的引用(比如字典、列表),就能修改对象的原始值,相当于通过传引用来传递对象,不可变对象(如数字、字符、元组),就不能通过直接修改原始对象,相当于是通过传值传递对象。
    具体的表现就是当赋值(引用)列表或者字典时,如果改变引用的值,就修改了原始的对象
    >>> a=[1,2,3,4]
    >>> b=a  #列表引用
    >>> id(a) 
    56454360
    >>> id(b) #a,b的内存地址一样,说明这里是内存地址拷贝,可以理解为指针指向
    56454360
    >>> b.append(5) #改变b的值,可以发现原始对象a的值也同样改版
    >>> b
    [1, 2, 3, 4, 5]
    >>> a
    [1, 2, 3, 4, 5]

而对于不可变对象

    >>> i=1  
    >>> i1=i #传递不可变对象数字
    >>> i
    1
    >>> i1
    1
    >>> id(i)
    23479136
    >>> id(i1) #此时两者内存地址相同,可以理解为指针指向
    23479136
    >>> i1=2 #改变i1的值

通过上面的例子,个人觉得对于可变对象的引用第一个例子中,对于b的改变仅仅是改变了它的元素,b依然是[1,2,3,4]这个列表的引用,所以不管是append还是pop都不会改变原始对象。而例2中当改变不可变对象i1时,i1和i就完全没有关系了,此时i1和i已经是两个对象的引用,也就是说i1=2相当于已经创建了一个新的值为2的对象。理解可能会有偏差,欢迎大家指正。
http://www.cnblogs.com/ShaunChen/p/5656971.htm
http://www.cnblogs.com/ShaunChen/p/5658770.html
https://blog.csdn.net/gumengkai/article/details/52261130

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值