首页
学习
活动
专区
圈层
工具
发布
    • 综合排序
    • 最热优先
    • 最新优先
    时间不限
  • 来自专栏Crossin的编程教室

    可变对象可变对象

    讲到这里就有个常被提及的概念: 可变对象和不可变对象 在 Python 中, 可变对象包括 list、dict、set、自定义类型等; 不可变对象包括 int、float、bool、str、tuple 不可变对象不允许对自身内容进行修改。如果我们对一个不可变对象进行赋值,实际上是生成一个新对象,再让变量指向这个对象。 上次我也说到,很多的教程都在用可变和不可变来谈论赋值和参数传递,我觉得这很不好。因为他们说到不可变对象时用的是赋值,而说到可变对象又用了 list 的索引、apeend 等方法,这根本是两码事。 而可变对象于不可变对象本身的不同仅在于一个可以修改变量的值,而另一个不允许。 基于这一设定,两者在功能上的最大区别就是:不可变对象可以作为字典 dict 的键 key,而可变对象不行。 另外,明白了可变可变的区别,一些方法的效果也就自然理解了: s = 'abc' s2 = s.replace('b', 'd') print('s', s) print('s2', s2) m =

    1.4K20发布于 2018-07-24
  • 来自专栏python3

    可变对象可变对象

    可变对象:   对象进行操作后,该对象内部是发生变化的   可以这样认为,操作直接作用于该对象,并使该对象发生了变化   比如list,对list进行操作,list内部的内容是会变化的 不可变对象:    对象进行操作后,该对象内部是不发生变化的   可以这样认为,操作该对象之前先将其复制一份,然后对该复制的对象进行操作,原来的对象不发生变化   比如str,对str进行操作

    1.3K10发布于 2020-01-16
  • 来自专栏me的随笔

    Python中的可变对象可变对象

    Python中所有类型的值都是对象,这些对象分为可变对象可变对象两种: 不可变类型 float、int、str、tuple、bool、frozenset、bytes tuple自身不可变,但可能包含可变元素 ,如:([3, 4, 5], 'tuple') 可变类型 list、dict、set、bytearray、自定义类型 +=操作符 +=操作符对应__iadd__魔法方法,对于不可变对象 ,a+=b和a=a+b等价,对于可变对象并不等价,dict和set不支持+=和+操作符。 # 只有l1发生变化 # l1 = l1 + [4] # l1和l2都发生变化,输出[1, 2, 3, 4, 5] l1 += [4, 5] print(l1) print(l2) 浅拷贝 深拷贝 赋值不同 ,只是若原对象中存在可变属性/字段,则浅拷贝产生的对象的属性/字段引用原对象的属性/字段,深拷贝产生的对象和原对象则完全独立: l1 = [1, 2, 3] l2 = l1.copy() print(l1

    1.7K10编辑于 2023-04-19
  • 来自专栏夏天爱西瓜

    Python可变对象和不可变对象

    Python中一切皆对象,每个对象都有其唯一的id,对应的类型和值,其中id指的是对象在内存中的位置。根据对象的值是否可修改分为可变对象和不可变对象。 不可变对象 对于不可变对象,如果要更新变量引用的不可变对象的值,会创建新的对象,改变对象的引用,举个例子: In [41]: x = 1 In [42]: y = x In [43]: print( 所以,不可变对象的优点是对于相同的对象,无论多少个引用,在内存中只占用一个地址,缺点是更新需要创建新的对象,因此效率不高。 可变对象 对于可变对象,举个例子: In [57]: a = [1, 2] In [58]: b = a In [59]: print(id(a), id(b)) 1961088949320 1961088949320 注意,我们研究可变对象的变化,研究的是同一对象,也就是可变指的是append, +=这种操作,而不包括新的赋值操作,赋值操作是会新建一个对象的。

    1.7K20发布于 2020-09-07
  • 来自专栏余林丰

    “不可变对象“不可变对象引用”

    什么是不可变对象呢? 我们从下图可以看到当定义String str = "test1"时,Java实际上做了这个操作(我们在这里讨论String关于使用new和不使用new,以及堆内存分配的问题)。 ? "test"变量其实并没有改变,改变的只是str的引用,将str的引用重新指向在常量池中新创建的"test1"变量,这即是"不可变对象"。 那么何为"不可变对象引用"呢? //main.user = new User(); //报错,因为final关键字修饰的变量不能改变它的引用 21 22 } 23 24 } 以上便是“不可变对象“不可变对象引用”的区别,为什么要区分这两个概念,这是为后面Java多线程的线程安全先做下铺垫。

    2.1K90发布于 2018-01-09
  • 来自专栏JetpropelledSnake

    Python入门之python可变对象可变对象

    本文分为如下几个部分 概念 地址问题 作为函数参数 可变参数在类中使用 函数默认参数 类的实现上的差异 概念 可变对象可变对象的区别在于对象本身是否可变。 python内置的一些类型中 可变对象:list dict set 不可变对象:tuple string int float bool 举一个例子 # 可变对象 >>> a = [1, 2, 3] >> ,而不可变对象则不可以。 这是因为l = []是在函数定义时就确定下来的了,所以之后每次调用这个函数,使用的l都是同一个,如果指定这个参数的新值,就会出现上面这个问题。 正常定义一个类它的属性是可以正常访问和修改的,所以那些类的实例都是可变对象。 我们只要定义一个类,不允许它修改属性,就可以创建一个不可变对象

    1.2K60发布于 2018-05-02
  • 来自专栏大数据-数据人生

    Java 可变对象和不可变对象

    Java 可变对象和不可变对象 作者:幽鸿   Mar 14, 2016 10:21:27 PM 一、简单定义            不可变对象(Immutable Objects)即对象一旦被创建它的状态 (对象的数据,也即对象属性值)就不能改变,反之即为可变对象(Mutable Objects)。       不可变对象的类即为不可变类(Immutable Class)。Java平台类库中包含许多不可变类,如String、基本类型的包装类、BigInteger和BigDecimal等。 (4)可以很好的用作Map键值和Set元素     不可变对象最大的缺点就是创建对象的开销,因为每一步操作都会产生一个新的对象。      */     private final double fMass;     /**      * 不可变对象属性 (String对象可变)      

    2.4K20发布于 2020-04-02
  • 来自专栏技术汇

    python可变对象和不可变对象

    在Python中,对象可变属性可以分为可变对象和不可变对象两种。理解这两种对象的差异对于编写高效且易于维护的代码至关重要。 本文将介绍Python中的可变对象和不可变对象,以及在使用它们时需要注意的事项。 1. 可变对象 Mutable objects can change their value but keep their id(). 1.1 列表(list) 列表是Python中最常见的可变对象之一。 虽然字符串本身是不可变的,但我们可以通过切片(slicing)来获取字符串的子串,这实际上是创建了一个新的字符串对象。例如: my_str = 'Hello, world!' 这是因为字符串在Python中是不可变的,任何对字符串的操作都会生成一个新的字符串对象。 除了切片操作外,我们还可以使用字符串的一些常用方法来处理字符串,如拼接、替换、分割等。

    1.6K20编辑于 2023-09-25
  • 来自专栏好派笔记

    “不可变对象“不可变对象引用”区别

    那么何为"不可变对象引用"呢? final只保证引用类型变量所引用的地址不会改变,即一直引用同一个对象,但是这个对象的内容(对象的非final成员变量的值可以改变)完全可以发生改变(比如final int[] intArray;,intArray 为什么String对象是不可变的?   要理解String的不可变性,首先看一下String类中都有哪些成员变量。 0   其中,成员变量hash并没有用final声明,但是由于第一次调用hashCode()会重新计算hash值,并且以后调用会使用已缓存的值,当然最关键的是每次计算时都得到相同的结果,所以也保证了对象的不可变 , 所以value也只是一个引用,它指向一个真正的数组对象

    2K20发布于 2021-10-08
  • 来自专栏后端学习之道

    Java中的可变对象(Mutable)可变对象(Immutable)

    如何在 Java 中创建不可变对象?我以前以为所有对象都是不可变的,因为如果你改变一个 String 实例的内容,它总是会创建一个新的 String 对象并指向该对象。 在本文中,我不仅将分享在 Java 中Immutable的步骤,还将讨论可变对象可变对象及其优缺点。这也是一个常见的 String 面试问题 ,Java 开发人员也应该意识到这一点。   既然我们已经知道什么是 Java 中的可变类和不可变类,那么现在就来了解一下如何编写不可变类,以及编写不可变创建可变类有什么不同。唯一的区别在于如何编写。 Java 中不可变对象可变对象的区别 以下是 Java 中可变类和不可变类之间的一些主要区别: 1. 修改 可变对象在创建后可以修改,但不可变对象在创建后不能修改。 2. 状态更改 可变对象允许更改状态,但不可变对象的状态在创建时是固定的。 4. 使用案例 当你需要经常修改对象,或想表示状态会随时间变化的实体时,可变对象就派上用场了。

    1.1K30编辑于 2023-11-08
  • 来自专栏算法channel

    Python解惑之对象可变可变

    编程关键问题 面向对象的语言,普遍存在的一个问题就是对象可变(mutable),对象的不可变(immuatable)。 接触过c, c++, c#, java, python, 这些语言除了c不具有强烈的这个(可变可变)色彩外,其他语言都存在这个性质。 因为时间紧张,这个话题分为两部分总结,今天先来说说:可变可变的概念,以及为什么要重视它;接下来,说说怎么利用可变可变,怎么避免掉入陷阱。 用户自定义的类(未特别声明为不可变对象) 由此可见,Python中常见的内置不可迭代的对象往往为不可变对象,但是也有例外,如frozenset;而可迭代对象往往是可变对象。 以上是不可变对象使用时注意事项,那么,任何场合使用可变对象,就不会出现问题吗? 未必! 可变对象使用同样有一定陷阱。

    98820发布于 2019-05-28
  • 来自专栏python3

    Python中的可变对象和不可变对象

    什么是可变/不可变对象可变对象,该对象所指向的内存中的值不能被改变。 可变对象,该对象所指向的内存中的值可以被改变。变量(准确的说是引用)改变后,实际上是其所指的值直接发生改变,并没有发生复制行为,也没有开辟新的出地址,通俗点说就是原地改变。 先看不可变对象可变对象的例子 先说明一点is 就是判断两个对象的id是否相同, 而 == 判断的则是内容是否相同。 难道这是可变对象可变对象由于所指对象可以被修改,所以无需复制一份之后再改变,直接原地改变,所以不会开辟新的内存,改变前后id不变。

    2.2K51发布于 2020-01-20
  • 来自专栏python3

    python可变对象和不可变对象的解释

    数据类型分为可变、不可变可变对象表示可以原处修改该数据对象,不可变对象表示必须创建新对象来保存修改后的数据。 在基础数据类型中: 数值、字符串、元组、frozenset是不可变对象 列表、set、dict是可变对象 对于可变对象,比如有一个列表L,查看它的id以及第一个元素的id。 可变对象(不仅仅是这里的序列、列表)意味着修改该数据对象,不会在内存中新创建另一个内存空间来存放新数据对象。例如,修改这个列表中的第一个元素为"aa"。 这是因为这个元素是字符串,而字符串是不可变对象。 不可变对象意味着,不能在原始内存地址块中修改数据,必须新创建一个地址块来保存修改后的数据对象。正如上面修改字符串"a"为"aa"的结果。 虽然可变对象可以原处修改数据,不会创建新对象,但并不意味着操作可变对象总是不会创建新对象,这取决于对可变对象做什么操作,比如分片操作一定会创建新对象

    1.8K20发布于 2020-01-20
  • 来自专栏自动化、性能测试

    Python - 可变和不可变对象

    前置知识 在 Python 中,一切皆为对象 Python 中不存在值传递,一切传递的都是对象的引用,也可以认为是传址 有哪些可变对象,哪些不可变对象? 不可变对象:字符串、元组、数字(int、float) 可变对象:数组、字典、集合 不可变对象可变对象的区别? 可变对象:改变对象内容,对象在内存中的地址不会被改变 不可变对象:改变对象内容,对象在内存中的地址会被改变;如果必须存储一个不同的值,则必须创建新的对象可变对象的应用场景 它们在需要常量哈希值的地方起着重要作用 不可变对象 ? ),当然值也是一样的啦 Python 函数的参数传递 这里先提前讲下函数的入门,因为参数传递是个挺重要的点 概念 开头有讲到,Python 的一切传递都是对象的引用,函数参数传递也例外 当传递给函数的是一个变量

    1.9K40发布于 2021-08-06
  • 来自专栏python百例

    117-可变可变对象的效率

    python的各种数据类型,按更新模型可以分为可变类型(如列表、字典)和不可变类型(如数字、字符串和元组)。多使用可变类型,它的执行效率比不可变类型要高。 result 是字符串,字符串不可变,所以python在工作时,首先要申请一段内存储 result 的初值(空串''),随机取得一个字符后(如'a'),result += 'a'实际上是要重新申请一个新的内存 如果变量 result 使用列表,只需要为其分配一次内存即可,因为列表是可变的。

    76110发布于 2018-10-10
  • 来自专栏后端技术

    JAVA final 可变对象

    参考:http://www.importnew.com/7553.html final 关键字 简单来说 final关键字不可变 final方法不可被重写 final类不可被继承 final变量 // String LOAN = "loan"; } // main函数内 LOAN = new String("loan") //invalid compilation error final使得类成员不可变 http://www.cnblogs.com/jaylon/p/5721571.html 特性 成员的值不变 因为值不变,只能读取不能写,所以线程安全 如何建立一个不可变类? 在getter方法中,不要直接返回对象本身,而是克隆对象,并返回对象的拷贝 关于4,如果是String等不可变类的话就可直接赋值。 关于5,如果是返回String等不可变类的对象的话,不必再拷贝,可直接返回。 因为我们的目的是让成员变量不能改,最多只能读。

    1.1K30发布于 2019-05-25
  • 【进阶Python】可变对象拷贝

    这就引出了理解可变对象的重要性,下面就来详细介绍一下Python的可变对象拷贝。 可变”相对的就是“不可变”,下面就列举一下Python内置可变对象和不可变对象可变对象:list,set,dict 不可变对象:int,float,bool,str,tuple,unicode copy 前面介绍了可变对象不可对象的区别:不可变对象在赋值或者修改之后会重新申请地址,而不是在原来地址上修改对象。 结语 之所以在这里介绍Python可变对象,就是因为并不是所有的Python内置对象都像我们潜意识认知的那样,“赋值后就如同拷贝了一份数据,原始变量赋值变量之间不会互相影响”。 但是,事实上Python可变对象并不像我们想象的那样,原始变量赋值变量之间会有互相作用,如果疏忽这一点会发生一些我们无法理解的错误,这类语言特性造成错误在调试过程中也很难定位,当我们了解这些容易被忽略的特性之后则不然

    10710编辑于 2025-12-16
  • 来自专栏CS实验室

    Python 对象引用可变

    Python 对象引用可变性 Python 中的变量都是引用式的,这个概念很容易在写代码的时候引入 bug,还不易察觉。 这篇文章就是讲述 Python 中对象的引用和可变性,然而首先要抛弃变量是存储数据的盒子的传统观念。 变量不是盒子,是标签 Python 中对变量有一个形象的比喻:变量不是盒子,是标签。 但元组和其他集合一样保存的是对象的引用,也就是说虽然元组本身不可变,但若其保存的对象可变的,元组内的元素就是可变的。 所以,元组的相对不可变性指的就是, tuple 数据结构的物理内容(即保存的引用)不变,引用的对象无关。 _name) print(f.money is s.money) 运行结果: True False True 因此,如果默认值是可变对象,而且修改了它的值,那么后续的函数调用都会受到影响

    57520发布于 2021-03-22
  • 【python】不可变对象可变对象 || 运算符 == is 的区别 || 浅拷贝和深拷贝

    问题一:不可变对象可变对象 含义: 不可变对象:是指创建后,内容不可修改的对象。我们只能通过重新创建这个对象的方式来实现修改它的内容。 可变对象:是指创建后,内容可修改的对象。 修改内容后,这个对象本身还是之前那个对象。 常见不可变对象:如整数 int,浮点 float,字符串 str,元组 tuple 等。 常见可变对象:如列表 list,字典 dict,集合 set 等。 问题二:运算符 == is 的区别 含义: == 运算符:比较两个对象的值是否相等。即使两个不同对象,它们的值也可以相等。 is 运算符:比较两个对象是否相同。即它们是否指向内存的同一个位置。 3:对于可变对象内部嵌套的不可变对象,比如列表中嵌套的列表的元素为整数时,字典中嵌套的字典的值为字符串时,它们也会重复使用已有对象的内存地址。

    38810编辑于 2025-02-16
  • 来自专栏机器学习与python集中营

    图解python可变对象(mutable)

    ☞机器学习、深度学习、python全栈开发干货 作者:zhengguo 来源:python算法社区 可变可变 列表(list)是一个可变容器,可变可变是一对很微妙的概念,因为网上经常出现,所以再重点总结下 因此,对列表而言,它能增加或删除元素,所以它是可变的。 但是,如果仅仅在列表a中做这一步操作: a[2].insert(1,6) #在`a[2]`(也是一个列表)中插入元素6 插入后可视化图: ? 对于“可变”这个概念而言,这就不是真正让a可变的操作。 tuple就是一个典型的不可变容器对象,对它而言,同样也可以修改嵌套对象的取值,但这并没有真正改变tuple内的元素。 不可变容器对象的本质:一旦创建后,长度就被唯一确定。但是,对于list而言,长度会有增有减,所以它是可变的。

    1.2K10发布于 2019-12-10
领券