python教程:python中的引用及其对引用的所有操作

news/2024/10/17 21:28:19/

在 Python 中,引用指的是变量指向对象的机制。Python 中的所有变量都是引用,即变量名并不直接存储对象的值,而是指向存储对象的内存地址。因此,多个变量可以同时引用同一个对象,从而共享对同一个数据的修改。

Python 中引用的基本概念

  1. 对象和引用
    在 Python 中,一切皆对象。变量是对这些对象的引用。当你创建一个变量并赋值时,Python 会在内存中创建一个对象,并让变量引用(指向)该对象。

    python">a = [1, 2, 3]  # 'a' 引用一个列表对象
    b = a  # 'b' 现在也引用同一个列表对象
    

    在上面的例子中,ab 都引用同一个列表对象。因此,修改 b 的内容也会影响 a

  2. 赋值是引用
    当你将一个对象赋值给另一个变量时,Python 并不会创建新对象,而是将引用赋值给变量。

    python">a = [1, 2, 3]
    b = a  # b 和 a 引用相同的对象
    b.append(4)
    print(a)  # 输出:[1, 2, 3, 4],因为 a 和 b 引用的是同一个列表
    
  3. 浅拷贝与深拷贝
    如果你希望创建一个新对象,而不是引用原始对象,可以使用浅拷贝深拷贝

    • 浅拷贝copy.copy()):创建新对象,但对象中的子对象仍然是引用。
    • 深拷贝copy.deepcopy()):创建新对象,且对象中的所有子对象也会被递归地拷贝。
    python">import copy
    a = [1, 2, [3, 4]]
    b = copy.copy(a)  # 浅拷贝
    c = copy.deepcopy(a)  # 深拷贝b[2].append(5)
    print(a)  # 输出:[1, 2, [3, 4, 5]],因为浅拷贝的子对象是共享的
    print(c)  # 输出:[1, 2, [3, 4]],深拷贝完全独立
    
  4. 可变对象和不可变对象
    在 Python 中,可变对象(如列表、字典、集合等)可以在原地修改,而不可变对象(如整数、字符串、元组等)不能修改原对象,任何改变会创建新的对象。

    • 可变对象的修改会影响所有引用该对象的变量。
    • 不可变对象的修改会导致创建新对象。

    示例:

    python"># 可变对象
    a = [1, 2, 3]
    b = a
    b.append(4)
    print(a)  # 输出:[1, 2, 3, 4],a 和 b 都指向同一个列表对象# 不可变对象
    x = 10
    y = x
    y += 5
    print(x)  # 输出:10,x 和 y 指向不同的对象
    
  5. is== 的区别

    • == 用于判断两个对象的值是否相等。
    • is 用于判断两个变量是否引用同一个对象(即是否为同一个内存地址)。
    python">a = [1, 2, 3]
    b = a
    c = [1, 2, 3]print(a == b)  # 输出:True,a 和 b 的值相等
    print(a is b)  # 输出:True,a 和 b 引用的是同一个对象print(a == c)  # 输出:True,a 和 c 的值相等
    print(a is c)  # 输出:False,a 和 c 引用的是不同的对象
    
  6. id() 函数
    id() 函数返回对象的唯一标识符(即内存地址)。通过 id() 可以查看两个变量是否引用同一个对象。

    python">a = [1, 2, 3]
    b = a
    c = [1, 2, 3]print(id(a))  # 输出:a 的内存地址
    print(id(b))  # 输出:b 的内存地址,与 a 相同
    print(id(c))  # 输出:c 的内存地址,与 a 不同
    
  7. 函数参数传递
    Python 中,函数的参数传递是通过引用进行的。这意味着在函数内部修改可变对象(如列表)会影响外部的对象,但对不可变对象的修改不会影响外部对象。

    示例:

    python">def modify_list(lst):lst.append(4)  # 修改可变对象,影响外部def modify_integer(num):num += 10  # 修改不可变对象,外部不受影响my_list = [1, 2, 3]
    my_num = 10modify_list(my_list)
    modify_integer(my_num)print(my_list)  # 输出:[1, 2, 3, 4],列表被修改
    print(my_num)   # 输出:10,整数未被修改
    

引用操作总结

  1. 赋值操作:变量赋值是引用操作,不会创建新对象。
  2. 浅拷贝:使用 copy() 创建对象的浅拷贝,子对象仍然是共享的。
  3. 深拷贝:使用 deepcopy() 创建完全独立的副本,包括对象的子对象。
  4. 引用判断:使用 is 来判断两个变量是否引用同一个对象,id() 获取对象的内存地址。
  5. 函数参数传递:通过引用传递参数,可变对象会影响外部状态,不可变对象不会。

Python 的引用机制让变量之间可以共享同一个对象,从而提高了内存利用效率,同时也要求开发者在处理可变对象时注意避免不必要的副作用。


http://www.ppmy.cn/news/1539810.html

相关文章

C#中,重载(overload) 重写(override)的应用说明

一.重载(overload)& 重写(override)定义说明 1.重载(overload)& 重写(override) 1.1重载(overload):指的是在同一个类中定义多个具有相同名称但参数列表不同的方法。通过参数列表的不同,编译器能够区分这些方法,并根据调用时传递的…

SpringBoot发送邮箱

一、导入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-mail</artifactId> </dependency> 二、添加配置 application.yml文件 将username修改为自己的邮箱&#xff0c;password修改为…

【JavaScript】关于使用JS对word文档实现预览的一些思考

文章目录 mammothdocx4js mammoth 官网地址&#xff1a;https://github.com/mwilliamson/mammoth.js#readme 安装mammoth&#xff1a; npm i mammoth -S我们可以安装mammoth来实现上传的word文件的在线预览&#xff0c;我们以element的上传组件为示例&#xff1a; <temp…

Vue3子组件watch无法监听父组件传递的属性值

Vue3子组件watch无法监听父组件传递的属性值 1 问题描述2 引发原因3 解决方法 1 问题描述 假设子组件 ChildComponent 中有个属性a&#xff0c;默认值为 0&#xff0c;并且通过侦听器 watch 监听其数值变化。在父组件 ParentComponent 中调用子组件并将属性a的值赋为1传递给子…

finalshell连接navicat数据库

一、安装mysql数据库 这个安装在另外一篇里 超详细的finalshell安装数据库以及数据库的基本操作-CSDN博客https://blog.csdn.net/cfjbcg/article/details/142990671 二、连接 说明root这个用户连接&#xff0c;是有权限的限制的----》修改权限 use mysql pdate user set hos…

MySQL 篇-深入了解 InnoDB 引擎的逻辑存储结构、架构、事务原理、MVCC 原理分析(RC 级别、RR 级别)

&#x1f525;博客主页&#xff1a; 【小扳_-CSDN博客】 ❤感谢大家点赞&#x1f44d;收藏⭐评论✍ 文章目录 1.0 InnoDB 引擎 - 逻辑存储结构 2.0 InnoDB 引擎 - 架构 2.1 InnoDB 引擎 - 内存结构 2.2 InnoDB 引擎 - 磁盘结构 2.3 InnoDB 引擎 - 后台线程 3.0 InnoDB 引擎 - 事…

Java中字符串.split分割转List<String>判空问题

第一种分割直接分割&#xff0c;如果cph字符串为空&#xff0c;分割后cphList会>0 List<String> cphList Arrays.asList(cph.split(","));第二种判空后分割&#xff0c;如果cph字符串为空&#xff0c;判空后再分割cphList会0 List<String> cphList…

基于SpringBoot+Vue+Uniapp家具购物小程序的设计与实现

详细视频演示 请联系我获取更详细的演示视频 项目运行截图 技术框架 后端采用SpringBoot框架 Spring Boot 是一个用于快速开发基于 Spring 框架的应用程序的开源框架。它采用约定大于配置的理念&#xff0c;提供了一套默认的配置&#xff0c;让开发者可以更专注于业务逻辑而…