精华内容
下载资源
问答
  • Python中有可变对象不可变对象之分。可变对象创建后可改变但地址不会改变,即变量指向的还是原来的变量;不可变对象创建之后便不能改变,如果改变则会指向一个新的对象。Python中dict、list是可变对象,str、int、...

    Python中有可变对象和不可变对象之分。可变对象创建后可改变但地址不会改变,即变量指向的还是原来的变量;不可变对象创建之后便不能改变,如果改变则会指向一个新的对象。Python中dict、list是可变对象,str、int、tuple、float是不可变对象。

    来看一个字符串的例子

    a = "hello"

    print(id(a)) # 输出 140022851974560

    a[0]="a" # 抛出异常:TypeError: 'str' object does not support item assignment

    a = a + " world"

    print(id(a)) # 输出 140022850763824

    上面的例子里,修改a指向的对象的值会导致抛出异常。

    执行 a = a + " world"时,先计算等号右边的表达式,生成一个新的对象赋值到变量a,因此a指向的对象发生了改变,id(a) 的值也与原先不同。

    再来看一个列表的例子

    a = [1,2,3]

    print(id(a)) # 输出 140022851303976

    a[0]=5

    print(a) # 输出 [5, 2, 3]

    print(id(a)) # 输出 140022851303976

    a.append(5)

    print(a) # 输出 [5, 2, 3, 5]

    print(id(a)) # 输出 140022851303976

    b = a

    print(id(b)) # 输出 140022851303976

    b[0] = 6

    print(b) # 输出 [6, 2, 3, 5]

    print(a) # 输出 [6, 2, 3, 5]

    c = b[:]

    print(id(c)) # 输出 140022851006760

    print(id(b)) # 输出 140022851303976

    c.append(7)

    print(c) # 输出 [6, 2, 3, 5, 7]

    print(b) # 输出 [6, 2, 3, 5]

    上面对a修改元素、添加元素,变量a还是指向原来的对象。将a赋值给b后,变量b和a都指向同一个对象,因此修改b的元素值也会影响a。变量c是对b的切片操作的返回值,切片操作相当于浅拷贝,会生成一个新的对象,因此c指向的对象不再是b所指向的对象,对c的操作不会改变b的值。

    展开全文
  • 根据对象的值是否可修改分为可变对象不可变对象可变对象包括:list,dict,set------对象存放在地址中的值不会被改变(所谓的改变是创建了一块新的地址并把新的对象的值放在新地址中原来的对象并没有发生变化)不可....

    最近再复习python进阶,又看到了python可变和不可变对象这对名词。

    定义:

    Python中一切皆对象,每个对象都有其唯一的id,对应的类型和值,其中id指的是对象在内存中的位置。根据对象的值是否可修改分为可变对象和不可变对象

    可变对象包括:list,dict,set

    ------对象存放在地址中的值不会被改变(所谓的改变是创建了一块新的地址并把新的对象的值放在新地址中原来的对象并没有发生变化)

    不可对象包括:数字,字符串,tuple

    ------对象存放在地址中的值会原地改变

    代码验证:

    1 id 函数的引进, id函数可以获取变量的内存地址

    foo = ['hi']

    print("foo id :",id(foo))

    #foo id : 140362527318096

    2 可变对象的演示

    foo = ['hi']

    # list 是可变对象

    bar = foo

    # bar 拷贝了 list

    bar += ['bye']

    print(foo is bar)

    #True

    #is 函数验证的是两个变量的内存地址是否相同

    print("foo id :", id(foo), foo)

    # foo id : 140387610034080 ['hi', 'bye']

    print("bar id :", id(bar), bar)

    # bar id : 140387610034080 ['hi', 'bye']

    #通过打印两个参数的内存地址,进一步验证了foo 和 bar是同一个变量,指向

    #同一个地址,只是两个不一样的名字借图演示,可变对象本质是一个内容的两个名字,都指向同一个内容

    3 不可变对象的演示

    tuple_foo = ('hi')

    #tuple 元组是不可变对象

    tuple_bar = tuple_foo

    #tuple_bar拷贝了tuple_bar,如果和list一样

    #内存地址通过 is 函数验证应该返回True

    tuple_bar += ('bye')

    print(tuple_foo is tuple_bar)

    #False

    #经过验证,两个变量的内存地址不同

    print("tuple_foo id :", id(tuple_foo), tuple_foo)

    # tuple_foo id : 140362412483888 hi

    print("tuple_bar id :", id(tuple_bar), tuple_bar)

    # tuple_bar id : 140362528259760 hibye

    #通过打印内存地址,可见两个变量内存地址不一样,输出的内容也不同不可变对象本质是两个不同的名字指向两个不同的内容,即不同的内存地址

    参考

    展开全文
  • 不可变对象:除列表、字典外其他均为可变对象可变对象:列表、字典1)不可变类型指的是变量指向的值是不能更改的,也就是这个内存地址只存放这个值。修改变量值的时候,其实是在内存中申请一块新的内存地址,创建了一...

    不可变对象:除列表、字典外其他均为可变对象

    可变对象:列表、字典

    1)不可变类型指的是变量指向的值是不能更改的,也就是这个内存地址只存放这个值。修改变量值的时候,其实是在内存中申请一块新的内存地址,创建了一个新的对象,并不是在原来的地址上做修改。

    str内存地址38955248处的值在未进行垃圾回收前一直是'abc',str2相当于是开辟了一块新的内存地址32116824来存放。

    str='abc'

    print id(str)

    #修改str的值,str2和str的内存地址是不一样的

    str2=str+'d'

    print id(str2),id(str)

    #不会影响str的值

    print str

    运行结果:

    38955248

    32116824 38955248

    abc

    2)可变类型指的是变量指向的内存地址上的值是可以改变的,即可以在原来的内存地址上对变量进行操作。

    列表a在内存地址38379336上存放的值是[1, 2, 3] ,当增加一个地元素的时候,其内存地址没有发生变化,也就是说是在原有的内存地址上将值修改的。

    a = [1, 2, 3]

    print id(a)

    a.append(4)

    print id(a)

    运行结果:

    38379336

    38379336

    展开全文
  • 本节书摘来自华章出版社《python 与数据挖掘 》一书中的第3章,第3.3节,作者张良均 杨海宏 何子健 杨 征,更多章节内容可以访问...我们在前面已经介绍过数值类型是不可变对象,当程序尝试改变数据的值时,程序...

    本节书摘来自华章出版社《python 与数据挖掘 》一书中的第3章,第3.3节,作者张良均 杨海宏 何子健 杨 征,更多章节内容可以访问云栖社区“华章计算机”公众号查看。

    3.3 可变对象与不可变对象

    Python的所有对象可分为可变对象和不可变对象(见表3-1)。所谓可变对象是指,对象的内容可变,而不可变对象是指对象内容不可变。

    我们在前面已经介绍过数值类型是不可变对象,当程序尝试改变数据的值时,程序会重新生成新的数据,而不是改变原来的数据。

    之所以本书要将这部分内容放到函数这一章,是因为Python函数的参数都是对象的引用。如果在引用不可变对象中尝试修改对象,程序会在函数中生成新的对象,函数外被引用的对象则不会被改变。请看下面一个函数:def add1(num):

    num +=1

    执行num = 1,add1(num),然后再输出num的值,发现num的值还是1。这是因为主程序中的num与函数中的num是不一样的,具体一点说,它们的地址不一样,所以改变函数中的num值时并不会改变函数外的num。如果希望改变主程序的num值,可以通过返回值实现。

    但如果参数是一个列表:

    def add_ele(list):

    list.append(3)

    >>>L= [1,2]

    >>>add_ele(L)

    输出L时你会发现L变成了[1,2,3],这是因为函数的参数是引用。

    如果我们希望赋值时可变对象不进行引用,而是重新分配地址空间并将数据复制,我们可以利用Python的copy模块。其中主要的函数有copy.copy和copy.deepcopy。

    1)copy.copy 仅仅复制父对象,不会复制父对象内部的子对象。

    2)copy.deepcopy 复制父对象和子对象。

    下面给出了一个很好的例子,如代码清单3-2所示。

    代码清单3-2 深复制与浅复制

    # 深复制与浅复制

    import copy

    list1 = [1,2,['a','b']]

    list2 = list1

    list3 = copy.copy(list1)

    list4 = copy.deepcopy(list1)

    list1.append(3)

    list1[2].append('c')

    print 'list1 = ',list1

    print 'list2 = ',list2

    print 'list3 = ',list3

    print 'list4 = ',list4

    # result:

    # list1 = [1, 2, ['a', 'b', 'c'], 3]

    # list2 = [1, 2, ['a', 'b', 'c'], 3]

    # list3 = [1, 2, ['a', 'b', 'c']]

    # list4 = [1, 2, ['a', 'b']]

    *代码详见:示例程序/code/3-3.py

    展开全文
  • 原标题:一道问题引出的python中可变数据类型与不可变数据类型一. 问题的提出我们先来看两个对比第一道题,当对象为整数时,最终结果:b = 2, a = 1,b的变化没有引起a的变化 第二道题,当对象为字典时,最终结果:a...
  • React实战-Reactjs中的如何通过不可变数据对象提高页面性能 在使用ReactJs之后,我们知道Reactjs的UI更新方式,由于props或者state的数据变化都将导致页面的render,而ReactJs是组件化的,小组件组装成大组件,大...
  • 主要介绍了C#中的不可变数据类型介绍(不可变对象、不可变集合),本文讲解了不可变对象、自定义不可变集合、Net提供的不可变集合、不可变优点、不可变对象缺点等内容,需要的朋友可以参考下
  • 1、可变对象数据类型_不可变对象数据类型 要谈论可变对象类型、不可变对象类型,需要先搞清python中内存结构。在python中内存分为两部分,堆和栈。堆中存放对象,栈中存放对象的引用,所以对象数据类型只是针对堆中...
  • Python 不可变对象,函数式编程中不能使用变量跟踪计算的状态,所以我们需要研究如何使用不可变对象,比如可以使用元组和命名元组构建复杂的不可变数据结构。不可变对象的概念在Python中并不陌生。程序使用不可变...
  • Python中的数据对象分为可变对象和不可变数据对象,可变和不可变又是指什么呢? 那么Python中哪些是不可变的对象,哪些又是可变的对象呢? 划分依据: 如果修改一个对象的内容修改前和修改后,该对象在内存...
  • 本节书摘来自华章出版社《python 与数据挖掘 》一书中的第3章,第3.3节,作者张良均 杨海宏 何子健 杨 征,更多章节...所谓可变对象是指,对象的内容可变,而不可变对象是指对象内容不可变。 我们在前面已经...
  • 不知这样的“不可变对象”有啥意义,是在并发这块看到的 ![图片说明](https://img-ask.csdn.net/upload/201709/22/1506072424_697678.png) 书上说set对象无法修改 ![图片说明]...
  • python精讲 不可变对象与可变对象

    千次阅读 2020-07-22 15:46:35
    文章目录对象可变对象不可变对象可变对象不可变对象 对象 Python 中的变量不是装有对象的“容器”,而是贴在对象上的“标签”。 真正的存贮位置是内存中 在python中,可变对象包括:list、set、dict、自定义对象...
  • 可变对象不可变对象 对象 对象里面存放了三个数据 id(标识) type(类型) value(值) 可变对象 可变对象的内容是可变的 # 列表是一个可变对象 # lst = [1,2,3] # print(id(lst)) # lst[0] = 10 # print(id...
  • 其它的都是不可变类型,那我们要修改他时怎么办呢,这个时候就新生成的一个对象,然后将变量名指向这个新对象,修改动作就完成了。关于可变类型与不可变类型的一个特点,我们可以先看看一段奇怪的代码In [1]: a = 'a...
  • 浮点型,字符串,元组属于不可变类型,列表,字典是可变类型不可变数据类型对不可变类型的变量重新赋值,实际上是重新创建一个不可变类型的对象,并将原来的变量重新指向新创建的对象(如果没有其他变量引用原有对象...
  •  不可变对象(Immutable Objects)即对象一旦被创建它的状态(对象数据,也即对象属性值)就不能改变,反之即为可变对象(Mutable Objects)。  不可变对象的类即为不可变类(Immutable Class)。Java平台类库中包含...
  • object是所有对象的基类,type也是继承objecttype是一切type的类型借用某博客里的一张图片,他们的关系应该是这样的(蓝色表示继承,红色表示类型)可变和不可变对象的区别Python中的数据结构也可以分为可变对象不可...
  • 一、可变对象 1、可变对象定义: 不可变对象定义: 可变对象表示可以原处修改该数据对象。...
  • Java 可变对象不可变对象

    千次阅读 2018-12-03 07:04:07
    不可变对象(Immutable Objects)即对象一旦被创建它的状态(对象数据,也即对象属性值)就不能改变,任何对它的改变都应该产生一个新的对象 String str = "a" ; str = "b&quot...
  • 1.什么是可变对象? 属性变更时不新建对象对象,如StringBuiler,可以将其中存储的字符串看作属性,调用StringBuilder.append(String str)追加字符串时...2.什么是不可变对象? 属性变更时必须新建对象对象,...
  • 我们可以使用:id()的方式进行查看(id()用来指出数据的内存地址)不可变数据类型例如:1 这个int类型的对象,我们通过输出得到那么,1 的内存地址为1663593952此时我们定义一个变量,将1 作为对象赋值给...
  • Python3中有六个标准的数据类型:Number(数字)String(字符串)List(列表)Dictionary(字典)Tuple(元组)Set(集合)我理解的可变就是当一个变量创建时,在...如果这个对象不可变的,那么在对对象进行操作时,必须在内...
  • 一切皆对象,完全的面向对象,跟Java不一样,Java的基本数据类型并不是对象,比如int等,而在Python里面即便是内置的数据类型都是一个对象,虽然它们在命名的时候都是小写,所有的对象均可分为可变的和不可变的,...
  • ​ 前面学习了str,list,tuple,dict,set五种数据类型,其中list为可变对象,tuple,dict中的key,set中的 元素都是不可变对象,下面对可变对象不可变对象再进行一次演示。 1. 核心知识点: ​ 对可变对象进行操作...
  • 该问题也可被描述为 可变数据类型与不可变数据类型 不可变对象: 该对象所指向的内存中的值不能被改变.当改变某个变量的时候,由于其所指的值不能被改变,相当于会把原来的值复制一份再改变,相当于开辟了一个新的地址,...
  • 语法糖利用了JavaScript和TypeScript中可用类型系统的功能,为定义不可变和持久性的域模型和数据传输对象数据结构提供了轻松的方法。 现有技术 实施的概念在很大程度上受到了Scala和Kotlin的启发。 两种语言都将...
  • 先从数据类型角度理解可变对象不可变对象。 抽象数据类型的操作一般分为三类: 1、构造操作: 这类操作主要是基于一些已知信息,产生这个类的实例对象。类似银行进行开通账户 2、解析操作:这类操作是获取对象的...
  • python中的不可变数据类型,不允许变量的值发生变化,如果改变了变量的值,相当于是新建了一个对象,而对于相同的值的对象,在内存中则只有一个对象,内部会有一个引用计数来记录有多少个变量引用这个对象;...
  • 背景:探寻python的数据类型是否可变,也可以更好的...可不变数据类型:当变量数值被修改后,变量的内存地址发生变更(创建了新对象),则认为是不可变数据类型。针对python数据类型进行测试:数字:>>> a = ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 9,011
精华内容 3,604
关键字:

不可变数据对象