在 Python 中一切都可以看作为对象。每个对象都有各自的 id, type 和 value。
- id: 当一个对象被创建后,它的 id 就不会在改变,这里的 id 其实就是对象在内存中的地址,可以使用 id() 去查看对象在内存中地址。
- type: 和 id 一样当对象呗创建之后,它的 type 也不能再被改变,type 决定了该对象所能够支持的操作
- value: 对象的值
一个对象可变与否就在于 value 值是否支持改变。
相关学习推荐:python视频教程
不可变对象
常见的不可变对象(immutable objects):
- Number: int, float, complex
- string
- tuple
- frozenset:set 的另外一种类型
让我们通过例子感受一下
例子
>>> x=1 >>> y=x >>> id(x)==id(y) True >>> id(1)==id(y) True
这里创建了两个 int 对象,并且让 x,y 指向同一个对象,然后我们试着修改一下 x,让 x+1
>>>x=x+1
这个时候 x 的 id 值和 y 的 id 以及 1 的 id 还一样吗?
>>> x=x+1 >>> id(x)==id(y) False >>> id(x)==id(1) False >>> id(1)==id(y) True
从结果不难看出来,x 所指向的对象已经改变了,但是 1 并没有改变。这就是不可变对象,对于不可变对象来说,一旦创建之后就不允许被改变。
注意: 不可变并不严格等同绝对的不可变
>>> a=([1],2,3) >>> id(a) 4338862696 >>> id(a[0]) 4338949128 >>> a[0][0]=0 >>> id(a) 4338862696 >>> id(a[0]) 4338949128
从上面的例子不难看出,我们改变了 a[0] 的值,但是并没有影响它的 id 值。一个不可变容器对象如果包含对可变对象的引用,当后者的值改变时,前者的值也会改变;但是该容器仍属于不可变对象,因为它的 id 值不会改变的。
可变对象
常见的可变对象(mutable objects):
- list
- dict
- set
同样的通过例子感受一下
例子
>>> c = [1,2,3] >>> b = c >>> id(b)==id(c) True
创建两个 list 对象,并且让 c,d 指向同一个对象,然后我们试着修改一下 c
c[0]=4
这个时候在看一下两个对象的 id 值是否一致
>>> id(c)==id(b) True
修改之后,c,d 仍然指向同一个对象,所以不难得出结论,对于一个可变对象来说,修改 value 值并不会对它的 id 造成任何影响
函数参数
对于可变对象和不可变对象,他们两者在函数当作参数传递的时候表现也有所不同
例子
eg0
def update_list(nums_list): print(f'2 id:{id(nums_list)}') nums_list += [10] print(f'3 id:{id(nums_list)}') number_list = [5, 6] print(f'1:{number_list}, id:{id(number_list)}') update_list(number_list) print(f'4:{number_list}, id:{id(number_list)}')
看一下结果
1:[5, 6], id:4457707912
2 id:4457707912
3 id:4457707912
4:[5, 6, 10], id:4457707912
在看另外一个例子
eg1
def add_num(number): print(f'2:{id(number)}') number += 1 print(f'3:{id(number)}') num = 1 print(f'1:{num}, id:{id(num)}') add_num(num) print(f'4:{num}, id:{id(num)}')
看一下结果
1:1, id:4343768416
2 id:4343768416
3 id:4343768448
4:1, id:4343768416
有其他有些文章中,上面 eg0 被称为引用传递,eg1 被称为值传递。然而在官方文档中,并没有找到有关的这两个名词的任何内容,或者这种方式并不是上述的两者任意一种。
这里的重点是:对于可变对象,在函数中的值的改变,会导致对象改变;对于不可变对象,在函数中值的改变,对其不会造成任何影响
以上是详细分析之Python可变对象和不可变对象的详细内容。更多信息请关注PHP中文网其他相关文章!

在Python中实现工厂模式可以通过创建一个统一的接口来创建不同类型的对象。具体步骤如下:1.定义一个基础类和多个继承类,如Vehicle、Car、Plane和Train。2.创建一个工厂类VehicleFactory,使用create_vehicle方法根据类型参数返回相应的对象实例。3.通过工厂类实例化对象,如my_car=factory.create_vehicle("car","Tesla")。这种模式提高了代码的可扩展性和可维护性,但需注意其复杂

在Python中,r或R前缀用于定义原始字符串,忽略所有转义字符,让字符串按字面意思解释。1)适用于处理正则表达式和文件路径,避免转义字符误解。2)不适用于需要保留转义字符的情况,如换行符。使用时需谨慎检查,以防意外的输出。

在Python中,__del__方法是对象的析构函数,用于清理资源。1)不确定的执行时间:依赖垃圾回收机制。2)循环引用:可能导致无法及时调用,使用weakref模块处理。3)异常处理:在__del__中抛出的异常可能被忽略,使用try-except块捕获。4)资源管理的最佳实践:推荐使用with语句和上下文管理器管理资源。

pop()函数在Python中用于从列表中移除并返回指定位置的元素。1)不指定索引时,pop()默认移除并返回列表的最后一个元素。2)指定索引时,pop()移除并返回该索引位置的元素。3)使用时需注意索引错误、性能问题、替代方法和列表的可变性。

Python进行图像处理主要使用Pillow和OpenCV两大库。Pillow适合简单图像处理,如加水印,代码简洁易用;OpenCV适用于复杂图像处理和计算机视觉,如边缘检测,性能优越但需注意内存管理。

在Python中实现PCA可以通过手动编写代码或使用scikit-learn库。手动实现PCA包括以下步骤:1)中心化数据,2)计算协方差矩阵,3)计算特征值和特征向量,4)排序并选择主成分,5)投影数据到新空间。手动实现有助于深入理解算法,但scikit-learn提供更便捷的功能。

在Python中计算对数是一件非常简单却又充满趣味的事情。让我们从最基本的问题开始:怎样用Python计算对数?用Python计算对数的基本方法Python的math模块提供了计算对数的函数。让我们来看一个简单的例子:importmath#计算自然对数(底数为e)x=10natural_log=math.log(x)print(f"自然对数log({x})={natural_log}")#计算以10为底的对数log_base_10=math.log10(x)pri

要在Python中实现线性回归,我们可以从多个角度出发。这不仅仅是一个简单的函数调用,而是涉及到统计学、数学优化和机器学习的综合应用。让我们深入探讨一下这个过程。在Python中实现线性回归最常见的方法是使用scikit-learn库,它提供了简便且高效的工具。然而,如果我们想要更深入地理解线性回归的原理和实现细节,我们也可以从头开始编写自己的线性回归算法。使用scikit-learn实现线性回归scikit-learn库封装了线性回归的实现,使得我们可以轻松地进行建模和预测。下面是一个使用sc


热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

SublimeText3 Linux新版
SublimeText3 Linux最新版

SublimeText3 英文版
推荐:为Win版本,支持代码提示!

VSCode Windows 64位 下载
微软推出的免费、功能强大的一款IDE编辑器

螳螂BT
Mantis是一个易于部署的基于Web的缺陷跟踪工具,用于帮助产品缺陷跟踪。它需要PHP、MySQL和一个Web服务器。请查看我们的演示和托管服务。

ZendStudio 13.5.1 Mac
功能强大的PHP集成开发环境