我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Python 类,对象,数据分类,函数参数传递详解

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Python 类,对象,数据分类,函数参数传递详解

最近在基于python写的接口自动化脚本,从Excel表中读取所有数据,每一行数据保存为字典,再将很多行的字典数据保存到一个列表里,运行时发现,列表中的字典均相同,且一直是excel最后一行的数据,情况类比如下:


dd = {"a":1,"b":10}
i = 2
list1 = []
while i< 5:
    dd["a"] = i
    i+=1
    list1.append(dd)
print("list1:{}".format(list1))

运行结果如下图,打印结果并不是预期的 list1:[{'b': 10, 'a': 2}, {'b': 10, 'a': 3}, {'b': 10, 'a': 4}] ,为什么呢??

在这里插入图片描述

问题的关键在于,数据分为可变及不可变类型,python中字典是可变类型,列表实际保存的是字典所指向的那片内存,而这片内存的内容,保存的是最后一次修改的值。  

为加深理解,重新温故下python关于类、对象、数据分类、函数传递参数的相关知识。

1、基本概念

1.1 类与对象的关系

对象:包含属性(特征)和方法(行为)。例如,狗作为一个对象,有年龄、眼睛等特征,有走路、觅食等行为。

:即把有相同属性和方法的对象进行提取(抽象化),是对象的模板。例如,对狗这个对象进行抽象化,把具有觅食行为,具有年龄等相同特征的对象,抽象一个Animal类。1.2 self的作用


class Animal():
    self.age = 0    #类属性
    def Eat(self):      #类方法
        print ("觅食")
dog = Animal()   #类的实例化,即对象
cat = Animal()   #类的实例化,即对象
dog.Eat()   #相当于Animal.Eat(dog)

在python里,当对象调用类中的方法时,需要先把对象作为参数传入方法中,相当于告诉类,“老子来调用这个方法啦,留个名”。而对象把自己传入方法,就是通过self。  

如上图,dog对象调用Eat(self)方法,执行dog.Eat()时,先用self接收dog对象,等同于执行Animal.Eat(dog)。  

正是因为self参数接收的是对象本身,而self的英文翻译就是“自己,自个”,所以大家都约定俗成的用了这个单词,它并不是python的关键字,如果换成把self缓存that,here等,其实也一样。

1.3 对象的创建与引用  

在python中,一切都是对象。对象均具备三个属性:地址,类型,值。  

当"左边 = 右边"时,实际是创建、引用对象的过程。  

如a = 3, 3实际上是一个对象,且对象的值为3,对象创建后存储在内存中,被a所引用。

在这里插入图片描述

如果对象中的值可以更改,该值属于可变类型;  

如果对象中的值不能更改,该值属于不可变类型;  

如果对象中又包含对其他对象的引用,该对象就是容器,如d={},list1[0]=d,list1就是容器。

2、数据的分类  

数据可变不可变,指的是存储在内存的内容,即对象的值,是否可以被修改,分为俩大类:

  • 不可变类型:例如整型,浮点型,字符串类型;
  • 可变类型:例如字典,列表。

2.1 不可变类型  

不可变类型,即对象本身的值不可以改变。  

python在引用不可变类型的对象时,会寻找该对象是否创建过,若该对象已创建,则变量会直接引用该对象,不会再申请新的内存空间。


a = 3
b = 3
print(id(a))
print(id(b))
a = 4
print(id(a)) 
>> 502853488
>> 502853488
>> 502853520

3这个对象创建后,a、b都引用了它,所以打印出来的地址是相同的。  

当a = 4后,因为3属于不可变类型,因此又创建了一个4的对象,将a指向这个新创建的对象。

2.2 可变类型  

可变类型,即在对象本身的值允许改变,而内存地址不需要改变,如 列表.append。  

python在引用不可变类型的对象时,会先申请新的内存空间,来存储这个对象,有别于不可变类型。


a = [1,2,3]
b = [1,2,3]
print(id(a))
print(id(b))
a.append(4)
print(id(a)) 
>> 48751048
>> 48751560
>> 48751048

a、b创建了俩个相同内容的列表,但是其指向的内存地址不相同。当对a指向的可变对象增加元素后,a所引用的对象内容已改变,但地址依旧不变。

3、函数传递参数的方式

3.1 值传递  

主函数向调用函数传递的参数是不可变类型时,实际上只是将实参的拷贝(即临时副本)传递给了被调用函数,并不是实参本身,这样被调函数不能直接修改主调函数中变量的值,而只能修改其私有的临时副本的值。


def ChangeList(list1):
    list1[1] = 5
li = [1,1,1]
print (li)
ChangeList(li)
print (li)
>> [1, 1, 1]
>> [1, 5, 1]

如代码所示,s是字符串,属于不可变类型,传递给ChangeString(s)时,是将s实际的值传入,s本身不会被改变。

3.2 引用传递  

主函数向调用函数传递的参数是可变类型时,实际上是将实参的引用传入了调用函数,对引用的操作等于对其指定的对象进行操作。


def ChangeList(list1):
    list1[1] = 5li = [1,1,1]
print (li)
ChangeList(li)
print (li)
>> [1, 1, 1]
>> [1, 5, 1]

如代码所示,li是列表,属于可变类型,传递给ChangeList(list1)时,list1也指向了li所引用的同一片内存。

总结

1、类是对象的抽象化,对象是类的实例化,在python中一切都是对象。  

2、self代表的是对象本身,将对象作为一个参数传入方法中执行。  

3、内存中的内容按是否可以修改,分为可变类型和不可变类型,所对应的可变对象和不可变对象,创建和引用方式也不同。  

4、不可变类型参数被函数调用时,是值传递,可变类型参数被函数调用时,是引用传递。

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注编程网的更多内容!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Python 类,对象,数据分类,函数参数传递详解

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

golang函数接口类型参数传递

接口类型作为函数参数允许函数接受实现相同接口方法的不同具体类型的对象。这增强了代码灵活性,促进代码解耦,提高可扩展性和可重用性。具体步骤如下:定义一个接口,指定要实现的方法。定义一个函数,接受该接口的实现作为参数。将任何实现该接口的类型的对
golang函数接口类型参数传递
2024-04-22

SpringMVC参数传递之基本数据类型和复杂对象说明

这篇文章主要介绍了SpringMVC参数传递之基本数据类型和复杂对象说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
2022-11-13

C++ 函数参数详解:运行时类型识别在参数传递中的作用

C++ 函数参数详解:运行时类型识别在参数传递中的作用在 C++ 中,函数参数传递可以通过值传递、引用传递或指针传递实现。每种传递方式都有各自的优缺点。运行时类型识别 (RTTI) 是 C++ 中一种在运行时获取对象类型的机制。它允许我
C++ 函数参数详解:运行时类型识别在参数传递中的作用
2024-04-27

C++ 函数调用面向对象设计:参数传递和返回值的对象传递

在 c++++ 函数调用中,参数可以使用值传递(接收参数副本)或引用传递(接收对实际对象的引用)。返回值同样可通过值传递或引用传递。值传递会复制对象,而引用传递会传递对象的引用,从而影响实际对象。C++ 函数调用面向对象设计:参数传递和返回
C++ 函数调用面向对象设计:参数传递和返回值的对象传递
2024-04-30

PHP 函数的参数传递和返回值类型

php 中的参数传递有值传递和引用传递两种方式,返回值类型可以指定返回的数据类型。值传递:函数处理的是参数值的副本,对参数修改不影响调用函数的变量。引用传递:函数直接处理调用函数中变量的地址,对参数修改会影响调用函数的变量。支持的返回值类型
PHP 函数的参数传递和返回值类型
2024-04-13

C++ 函数参数详解:不同指针类型的传参方式对比

c++++ 中指针参数的传参方式有三种:传值、传引用和传地址。传值复制指针,不影响原始指针;传引用允许函数修改原始指针;传地址允许函数修改指针指向的值。根据需要选择合适的传参方式。C++ 函数参数详解:不同指针类型的传参方式对比函数参数传
C++ 函数参数详解:不同指针类型的传参方式对比
2024-04-27

C++ 函数参数的传递方式详解:值传递和引用传递

c++++ 参数传递方式分为值传递和引用传递。值传递创建函数参数副本,不影响原变量;引用传递直接操作原变量。选择方式取决于需求:保护原变量使用值传递,修改原变量或提高效率使用引用传递。C++ 函数参数的传递方式详解:值传递和引用传递在 C
C++ 函数参数的传递方式详解:值传递和引用传递
2024-04-12

C++ 函数参数详解:高阶函数中参数传递的范例

c++++ 中有两种参数传递机制:传值传递和传址传递。传址传递将对象的内存地址传递给函数,而传值传递将值的副本传递给函数。高阶函数是接受函数作为参数的函数,其参数传递需要特别注意,因为传递的函数可能具有不同的参数签名和返回类型。示例中,st
C++ 函数参数详解:高阶函数中参数传递的范例
2024-04-27

C++ 函数参数详解:函数重载中参数传递的影响

在 c++++ 函数重载中,函数参数的传递方式会影响函数重载的行为。影响如下:1. 传值:只关心参数数量和顺序;2. 传引用:考虑参数类型;3. 传指针:不考虑参数类型。实战中,理解传递方式对于正确重载函数至关重要,如上述 print()
C++ 函数参数详解:函数重载中参数传递的影响
2024-04-27

C++ 函数参数传递方式与对象成员函数的关系

c++++ 函数参数可通过传值或传引用传递。对象成员函数的参数传递额外考虑 this 指针,默认情况下,this 指针作为隐式参数传递。非引用参数默认传值,引用参数隐式指向 this。C++ 函数参数传递方式与对象成员函数的关系在 C++
C++ 函数参数传递方式与对象成员函数的关系
2024-04-12

Go语言函数参数传递方式详解

Go语言是一门由Google开发的开源编程语言,旨在提高开发人员的生产力和代码的可靠性。在Go语言中,函数参数的传递方式是非常重要的,它可以影响程序的性能和内存占用。1. 值传递值传递是指将参数的值复制一份传递给函数。在函数内部对参数的
Go语言函数参数传递方式详解
2024-03-09

Python函数参数传递以及变量作用域详解

这篇文章主要介绍“Python函数参数传递以及变量作用域详解”,在日常操作中,相信很多人在Python函数参数传递以及变量作用域详解问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Python函数参数传递以及变
2023-06-04

C++ 函数参数详解:函数式编程中参数传递的思想

c++++ 函数中参数传递有五种方式:引用传递、值传递、隐式类型转换、const 参数、默认参数。引用传递提高效率,值传递更安全;隐式类型转换自动将其他类型转换为函数期望的类型;const 参数防止意外修改;默认参数允许省略某些参数。在函数
C++ 函数参数详解:函数式编程中参数传递的思想
2024-04-28

详解Python中的函数参数传递方法*args与**kwargs

本文将讨论Python的函数参数。我们将了解args和kwargs,/和的都是什么,虽然这个问题是一个基本的python问题,但是在我们写代码时会经常遇到,比如timm中就大量使用了这样的参数传递方式
2023-03-09

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录