可变类型与不可变类型在命名空间中的一些场景

在Python中,变量空间的概念通常指的是变量在内存中的存储位置。可变类型和不可变类型在变量空间中的表现确实会导致一些常见的误解和错误。以下是一些具体的例子:

 

### 1. 可变类型作为函数参数

 

当你将可变类型(如列表)作为参数传递给函数时,如果函数内部修改了这个列表,那么原始列表也会被修改,因为列表对象的引用被传递了。

 

```python

def append_to_list(lst, value):

    lst.append(value) # 直接修改传入的列表

 

my_list = [1, 2, 3]

append_to_list(my_list, 4)

print(my_list) # 输出: [1, 2, 3, 4]

```

 

### 2. 不可变类型作为函数参数

 

对于不可变类型(如整数或字符串),即使函数尝试“修改”它们,实际上会创建一个新的对象。

 

```python

def double_value(x):

    x = x * 2 # 尝试修改x,但x是不可变类型,所以实际上创建了一个新的整数

 

value = 10

double_value(value)

print(value) # 输出: 10,原始值未改变

```

 

### 3. 可变类型作为函数返回值

 

当你从函数返回可变类型时,返回的是对象的引用,这意味着如果函数修改了返回的对象,调用者也能看到这些修改。

 

```python

def modify_and_return_list():

    my_list = [1, 2, 3]

    my_list.append(4)

    return my_list

 

original_list = modify_and_return_list()

print(original_list) # 输出: [1, 2, 3, 4]

```

 

### 4. 可变类型与不可变类型的赋值

 

当你将一个可变类型赋值给另一个变量时,两个变量引用同一个对象。而不可变类型则不同,赋值会创建一个新的对象。

 

```python

# 可变类型

list1 = [1, 2, 3]

list2 = list1

list2.append(4)

print(list1) # 输出: [1, 2, 3, 4],list1也被修改了

 

# 不可变类型

num1 = 5

num2 = num1

num2 = 10 # num2现在引用了一个新的整数对象,num1仍然是5

print(num1) # 输出: 5

```

 

### 5. 可变类型作为字典的键

 

字典的键必须是不可变类型,因为字典需要键的唯一性和不变性来确保哈希值的一致性。

 

```python

# 错误示例:尝试使用列表作为字典键

my_dict = {}

my_dict[[1, 2]] = "value" # 这将引发TypeError,因为列表是可变类型

```

 

### 6. 深拷贝与浅拷贝

 

深拷贝创建一个新对象,并且递归地复制所有子对象,而浅拷贝只复制对象本身,子对象仍然是引用。

 

```python

import copy

 

original_list = [[1, 2], [3, 4]]

shallow_copy = copy.copy(original_list) # 浅拷贝

deep_copy = copy.deepcopy(original_list) # 深拷贝

 

shallow_copy[0].append(5) # 修改了原始列表的第一个子列表

print(original_list) # 输出: [[1, 2, 5], [3, 4]]

 

deep_copy[1].append(6) # 只修改了deep_copy的列表

print(original_list) # 输出: [[1, 2, 5], [3, 4]]

```

 

这些例子展示了在变量空间中使用可变类型和不可变类型时可能出现的误解和错误。理解这些区别有助于编写更清晰、更可预测的代码。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/850560.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

js的锚点

本文描述js的锚点解释及使用方法: 在Web开发中,锚点(Anchor)通常用于创建页面内的链接,允许用户点击链接直接跳转到同一页面的不同部分。JavaScript可以用来增强锚点的功能,例如实现平滑滚动或动态修改锚点行为。以下…

Python面试宝典:Python中与数据科学概念相关的面试笔试题(1000加面试笔试题助你轻松捕获大厂Offer)

Python面试宝典:1000加python面试题助你轻松捕获大厂Offer【第二部分:Python高级特性:第二十六章:Python与数据科学:第一节:数据科学】 第二十六章:Python与数据科学第一节:数据科学python中与数据科学概念相关的面试笔试题面试题1面试题2面试题3面试题4面试题5更多面试…

uniapp实现微信小程序调用云函数【vue2】

在uniapp中的vue 2框架中想要改变默认的目录结构,将装有云函数的文件夹在运行后一起复制到unpackage 文件下,主要用 copy-webpack-plugin 方法来实现,具体步骤如下: 一、创建一个vue 2 框架的uniapp 二、新建一个文件夹装云函数 …

Git【版本控制命令】

02 【本地库操作】 1.git的结构 2.Git 远程库——代码托管中心 2.1 git工作流程 代码托管中心用于维护 Git 的远程库。包括在局域网环境下搭建的 GitLab 服务器,以及在外网环境下的 GitHub 和 Gitee (码云)。 一般工作流程如下: 1.从远程…

轻松掌握系统概况,提升工作效率

作为 Linux 系统管理员,我们经常需要了解系统的基本状况,比如当前时间、系统版本、内核信息、CPU 型号、内存使用等等。但是每次手动执行各种命令来获取这些信息,无疑是一件非常繁琐的事情。 幸运的是,我们可以通过编写一个简单的 shell 脚本来一键获取这些系统信息。让我们一…

Java 环境配置 -- Java 语言的安装、配置、编译与运行

大家好,我是栗筝i,这篇文章是我的 “栗筝i 的 Java 技术栈” 专栏的第 002 篇文章,在 “栗筝i 的 Java 技术栈” 这个专栏中我会持续为大家更新 Java 技术相关全套技术栈内容。专栏的主要目标是已经有一定 Java 开发经验,并希望进…

【iOS】内存泄漏检查及原因分析

目录 为什么要检测内存泄漏?什么是内存泄漏?内存泄漏排查方法1. 使用Zombie Objects2. 静态分析3. 动态分析方法定位修改Leaks界面分析Call Tree的四个选项: 内存泄漏原因分析1. Leaked Memory:应用程序未引用的、不能再次使用或释…

我的编程语言学习记录:一段不断探索的旅程

目录 我的编程语言学习记录:一段不断探索的旅程 1.引言 2.我的编程之旅开始 第一站:Python — 简洁之美 第二站:JavaScript — 网页的魔法 第三站:Java — 企业级的力量 3.学习过程中的挑战与克服 1.理解概念 3.记忆语法…

牛客网刷题 | BC118 N个数之和

目前主要分为三个专栏,后续还会添加: 专栏如下: C语言刷题解析 C语言系列文章 我的成长经历 感谢阅读! 初来乍到,如有错误请指出,感谢! 描述 输入数字N&#xf…

Servlet-01

文章目录 Servlet创建Servlet探究Servlet的生命周期 HttpServletWebServlet注解详解 重定向与请求转发ServletContextServletContext中的接口 HttpServletRequestHttpServletResponse状态码解释Cookie Servlet Q:它能做什么呢? A:我们可以通…

Hadoop3:MapReduce源码解读之Map阶段的数据输入过程整体概览(0)

一、MapReduce中数据流向 二、MapTask并行度 1、原理概览 数据块:Block是HDFS物理上把数据分成一块一块。数据块是HDFS存储数据单位。 数据切片:数据切片只是在逻辑上对输入进行分片,并不会在磁盘上将其切分成片进行存储。数据切片是MapRed…

XUbuntu24.04之ch9344(usb转串口芯片)安装驱动(二百四十五)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏:多媒…

11-Eureka-服务发现

11-Eureka-服务发现 1.在order-service完成服务拉取: 服务拉取是基于服务名称获取服务列表,然后再对服务列表做负载均衡 1.修改OrderService的代码,修改访问的url路径,用服务名称代替ip、端口: ​ String url = "http://userservice/user/" + order.getUser…

xshell远程无法链接上VM的centos7

1、现象如下, 2.解决办法:查证后发现这个默认的设置为vmnet0 3.参考文章:Xshell连接不上虚拟机centos7_centos7的nat模式可以ping通网络,但是用xshell连不上是什么原因-CSDN博客

linux内核获取未导出函数地址的两种方法

第一种 第一种是借助于kprobe机制,通过kprobe机制中会调用kallsyms_lookup_name函数并设置到kprobe结构体中返回的原理找到我们需要的函数地址 内核中调用逻辑简化代码如下: int register_kprobe(struct kprobe *p) {int ret;struct kprobe *old_p;st…

从GAN到WGAN(01/2)

从GAN到WGAN 文章目录 一、说明二、Kullback-Leibler 和 Jensen-Shannon 背离三、生成对抗网络 (GAN)四、D 的最优值是多少?五、什么是全局最优?六、损失函数代表什么?七、GAN中的问题 一、说明 生成对抗网络 &#…

SwiftUI四绘制路径和形状

代码下载 创建徽章视图 创建徽章前需要使用SwiftUI的矢量绘画API创建一个徽章视图 1、新建HexagonParameters.swift文件。HexagonParameters结构体定义了绘制徽章六边形形状的控制点参数。仅仅使用这些数据指定绘制徽章形状时,线段和曲线的控制点位置&#xff1a…

Camtasia Studio怎么自动加字幕呢,Camtasia Studio有什么功能呢

在信息化高度发达的今天,视频作为一种直观、生动的信息表达方式,受到了越来越多人的青睐。无论是教育领域的教学视频,还是企业宣传的推广短片,甚至是个人创作的分享作品,都离不开一款优秀的视频编辑软件。Camtasia Stu…

【Python数据分析--pandas学习笔记】Python数据分析库pandas详细学习笔记(内容详细,适合小白入门),数据分析学习笔记

一,pandas教程 1-1 pandas 安装 1-1-1 使用 pip 安装 pandas: pip install pandas安装成功后,我们就可以导入 pandas 包使用: import pandas1-1-2 查看 pandas 版本 >>> import pandas >>> pandas.__version__ # 查看…

减少GPU显存的策略

训练时 减少batchsize图片尺寸缩小 推理时 cpu加载模型 pipe.enable_sequential_cpu_offload()减小精度 torch.float32 --> torch.float16其它