当前位置: 首页 > news >正文

Python入门【变量的作用域(全局变量和局部变量)、参数的传递、浅拷贝和深拷贝、参数的几种类型 】(十一)

 👏作者简介:大家好,我是爱敲代码的小王,CSDN博客博主,Python小白
📕系列专栏:python入门到实战、Python爬虫开发、Python办公自动化、Python数据分析、Python前后端开发
📧如果文章知识点有错误的地方,请指正!和大家一起学习,一起进步👀
🔥如果感觉博主的文章还不错的话,请👍三连支持👍一下博主哦
🍂博主正在努力完成2023计划中:以梦为马,扬帆起航,2023追梦人

🔥🔥🔥 python入门到实战专栏:从入门到实战
🔥🔥🔥 Python爬虫开发专栏:从入门到实战
🔥🔥🔥 Python办公自动化专栏:从入门到实战
🔥🔥🔥 Python数据分析专栏:从入门到实战
🔥🔥🔥 Python前后端开发专栏:从入门到实战    

目录

变量的作用域(全局变量和局部变量)

参数的传递

浅拷贝和深拷贝

参数的几种类型 


变量的作用域(全局变量和局部变量)

变量起作用的范围称为变量的作用域,不同作用域内同名变量之间 互不影响。变量分为:全局变量、局部变量。

全局变量:

1 在函数和类定义之外声明的变量。作用域为定义的模块,从定义位置开始直到模块结束。

2 全局变量降低了函数的通用性和可读性。应尽量避免全局变量的使用。

3 要在函数内改变全局变量的值,使用 global 声明一下

局部变量:

1 在函数体中(包含形式参数)声明的变量。

2 局部变量的引用比全局变量快,优先考虑使用

3 如果局部变量和全局变量同名,则在函数内隐藏全局变量,只使用同名的局部变量

【操作】全局变量的作用域测试

a = 100         #全局变量
def f1():global a    #如果要在函数内改变全局变量的值,增加global关键字声明print(a)    #打印全局变量a的值    a = 300      f1()
f1()
print(a)

 执行结果:

100

300

【操作】全局变量和局部变量同名测试

a=100
def f1():a = 3      #同名的局部变量print(a)f1()    
print(a)    #a仍然是100,没有变化

 执行结果:

3
100

【操作】 输出局部变量和全局变量

a = 100
def f1(a,b,c):print(a,b,c)print(locals())            #打印输出的局部变量print("#"*20)print(globals())           #打印输出的全局变量
f1(2,3,4)

输出结果:

2 3 4{'c': 4, 'b': 3, 'a': 2}####################
{'__name__': '__main__', '__doc__': None,
'__package__': None, '__loader__': <class
'_frozen_importlib.BuiltinImporter'>,
'__spec__': None, '__annotations__': {},
'__builtins__': <module 'builtins' (builtin)>, '__file__':
'E:\\PythonExec\\if_test01.py', 'a': 100,
'f1': <function f1 at 0x0000000002BB8620>}

实时效果反馈

1. 如下关于全局变量和局部变量的说法,错误的是:

A 全局变量:在函数和类定义之外声明的变量。作用域从定义位 置开始直到模块结束

B 局部变量:在函数体中(包含形式参数)声明的变量

C 如果局部变量和全局变量同名,则在函数内隐藏全局变量,只 使用同名的局部变量

D 局部变量的引用和全局变量一样快

局部变量和全局变量效率测试

局部变量的查询和访问速度比全局变量快,优先考虑使用,尤其是在循环的时候。

 

在特别强调效率的地方或者循环次数较多的地方,可以通过将全局

变量转为局部变量提高运行速度。

【操作】测试局部变量和全局变量效率 

import time
a = 1000
def test01():start = time.time()global afor i in range(100000000):a += 1end = time.time()print("耗时{0}".format((end-start)))
def test02():c = 1000start = time.time()for i in range(100000000):c += 1end = time.time()print("耗时{0}".format((end-start)))
test01()
test02()
print(globals())

运行结果:

耗时5.278882026672363
耗时3.6103720664978027

参数的传递

函数的参数传递本质上就是:从实参到形参的赋值操作。Python中 “一切皆对象”,所有的赋值操作都是“引用的赋值”。所以,Python 中参数的传递都是“引用传递”,不是“值传递”。

具体操作时分为两类:

1 对“可变对象”进行“写操作”,直接作用于原对象本身。

2 对“不可变对象”进行“写操作”,会产生一个新的“对象空间”,并用新的值填充这块空间。 

可变对象有: 字典、列表、集合、自定义的对象等

不可变对象有: 数字、字符串、元组、function等 

传递可变对象的引用

传递参数是可变对象(例如:列表、字典、自定义的其他可变对象 等),实际传递的还是对象的引用。在函数体中不创建新的对象拷贝,而是可以直接修改所传递的对象。

【操作】参数传递:传递可变对象的引用

b = [10,20]
def f2(m):print("m:",id(m))       #b和m是同一个对象m.append(30)    #由于m是可变对象,不创建对象拷贝,直接修改这个对象
f2(b)
print("b:",id(b))
print(b)

执行结果:

m: 45765960
b: 45765960
[10, 20, 30]

实时效果反馈

1. 列表是可变对象,关于参数传递可变对象,说法错误的是:

b = [10,20]
def f2(m):print("m:",id(m))    m.append(30)  
f2(b)

A b和m是同一个对象

B b和m是不同的对象

C 对“可变对象”进行“写操作”,直接作用于原对象本身

D f2(b) 把 b 传递给 m 的过程中,没有创建对象的拷贝

传递不可变对象的引用

传递参数是不可变对象(例如: int 、 float 、字符串、元组、布尔值),实际传递的还是对象的引用。在”赋值操作”时,由于不可变 对象无法修改,系统会新创建一个对象。

【操作】参数传递:传递不可变对象的引用

a = 100
def f1(n):print("n:",id(n))        #传递进来的是a对象的地址n = n+200            #由于a是不可变对象,因此创建新的对象nprint("n:",id(n))    #n已经变成了新的对象print(n)
f1(a)
print("a:",id(a))

执行结果:

n: 1663816464
n: 46608592
300
a: 1663816464

显然,通过 id 值我们可以看到 n 和 a 一开始是同一个对象。给n赋值 后,n是新的对象。

实时效果反馈

1. 数字是不可变对象,关于参数传递不可变对象并且要修改原对 象,说法错误的是:

a = 100
def f1(n):n = n+200    
f1(a)

A 代码执行完后, b 和 n 是同一个对象

B 代码执行完后, b 和 n 是不同的对象

C 对“不可变对象”进行“写操作”,创建新的对象

D 执行 n=n+200 时,创建了新的对象

浅拷贝和深拷贝

 为了更深入的了解参数传递的底层原理,我们需要讲解一下“浅拷贝 和深拷贝”。我们可以使用内置函数: copy (浅拷贝)、 deepcopy (深拷贝)。

 1、浅拷贝:拷贝对象,但不拷贝子对象的内容,只是拷贝子对象的引用。

2、深拷贝:拷贝对象,并且会连子对象的内存也全部(递归)拷贝一份,对子对象的修改不会影响源对象

#测试浅拷贝和深拷贝
import copy
def testCopy():'''测试浅拷贝'''a = [10, 20, [5, 6]]b = copy.copy(a)print("a", a)print("b", b)b.append(30)b[2].append(7)print("浅拷贝......")print("a", a)print("b", b)
def testDeepCopy():'''测试深拷贝'''a = [10, 20, [5, 6]]b = copy.deepcopy(a)print("a", a)print("b", b)b.append(30)b[2].append(7)print("深拷贝......")print("a", a)print("b", b)
testCopy()
print("*************")
testDeepCopy()

运行结果:

a [10, 20, [5, 6]]
b [10, 20, [5, 6]]
浅拷贝......
a [10, 20, [5, 6, 7]]
b [10, 20, [5, 6, 7], 30]
a [10, 20, [5, 6]]
b [10, 20, [5, 6]]
深拷贝......
a [10, 20, [5, 6]]
b [10, 20, [5, 6, 7], 30]

实时效果反馈

1. 如下关于浅拷贝和深拷贝,错误的是:

A 浅拷贝使用函数: copy (浅拷贝)

B 浅拷贝:拷贝对象,也全部拷贝子对象

C 深拷贝:拷贝对象,也全部拷贝子对象

D 深拷贝使用函数: deepcopy (深拷贝)

传递不可变对象包含的子对象是可变的情况

#传递不可变对象时。不可变对象里面包含的子对象是可变的。则方法内修改了这个可变对象,源对象也发生了变化。
a = (10,20,[5,6])
print("a:",id(a))
def test01(m):print("m:",id(m))m[2][0] = 888print(m)print("m:",id(m))
test01(a)
print(a)

运行结果:

a: 41611632

m: 41611632 (10, 20, [888, 6])

m: 41611632 (10, 20, [888, 6])

参数的几种类型 

位置参数 

函数调用时,实参默认按位置顺序传递,需要个数和形参匹配。按 位置传递的参数,称为:“位置参数”。

【操作】测试位置参数

def f1(a,b,c):print(a,b,c)
f1(2,3,4)
f1(2,3)     #报错,位置参数不匹配

执行结果:

2 3 4
Traceback (most recent call last):File "E:\PythonExec\if_test01.py", line 5,
in <module>f1(2,3)
TypeError: f1() missing 1 required positional
argument: 'c

默认值参数

我们可以为某些参数设置默认值,这样这些参数在传递时就是可选 的。称为“默认值参数”。默认值参数放到位置参数后面。

【操作】测试默认值参数

def f1(a,b,c=10,d=20):   #默认值参数必须位于普通位置参数后面print(a,b,c,d)
f1(8,9)
f1(8,9,19)
f1(8,9,19,29)

执行结果:

8 9 10 20
8 9 19 20
8 9 19 29

命名参数

我们也可以按照形参的名称传递参数,称为“命名参数”,也称“关键 字参数”。

def f1(a,b,c):print(a,b,c)
f1(8,9,19)          #位置参数
f1(c=10,a=20,b=30)  #命名参数

执行结果:

8 9 19
20 30 10

实时效果反馈

1. 如下函数定义后,调用时,错误的是:

def f1(a,b,c=10,d=20):   #默认值参数必须位于普通位置参数后面print(a,b,c,d)

A f1(5)

B f1(5,6)

C f1(5,6,7,8)

D f1(b=5,a=6,d=7,c=8)

相关文章:

Python入门【变量的作用域(全局变量和局部变量)、参数的传递、浅拷贝和深拷贝、参数的几种类型 】(十一)

&#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是爱敲代码的小王&#xff0c;CSDN博客博主,Python小白 &#x1f4d5;系列专栏&#xff1a;python入门到实战、Python爬虫开发、Python办公自动化、Python数据分析、Python前后端开发 &#x1f4e7;如果文章知识点有错误…...

下级平台级联安防视频汇聚融合EasyCVR平台,层级显示不正确是什么原因?

视频汇聚平台安防监控EasyCVR可拓展性强、视频能力灵活、部署轻快&#xff0c;可支持的主流标准协议有GB28181、RTSP/Onvif、RTMP等&#xff0c;以及厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等&#xff0c;能对外分发RTSP、RTMP、FLV、HLS、WebRTC等…...

vue : 无法加载文件 C:\Users\jianfei\AppData\Roaming\npm\vue.ps1,因为在此系统上禁止运行脚本。...

背景 在新电脑上配置vue环境 PS E:\CODE_PROJ\myvue\vue23\P61_使用脚手架\vue_test> npm install -g vue/cli npm WARN deprecated source-map-url0.4.1: See https://github.com/lydell/source-map-url#deprecated npm WARN deprecated urix0.1.0: Please see https://git…...

godot引擎c++源码深度解析系列二

记录每次研究源码的突破&#xff0c;今天已经将打字练习的功能完成了一个基本模型&#xff0c;先来看下运行效果。 godot源码增加打字练习的demo 这个里面需要研究以下c的控件页面的开发和熟悉&#xff0c;毕竟好久没有使用c了&#xff0c;先来看以下代码吧。 //第一排 显示文本…...

专才or 通才

前言 不知道大家有没有这样的感觉&#xff0c;现在的工作专业化程度越来越高&#xff0c;而且是细分方向越来越小。IT领域分到你是计算里面的数据库或者了流式计算引擎&#xff0c;或者是协议存储还是KV存储引擎。 专业化的优势 专业化的程度带来了一个好处就是你在这个领域…...

【小白必看】Python爬虫实战之批量下载女神图片并保存到本地

文章目录 前言运行结果部分图片1. 引入所需库2. 发送请求获取网页内容3. 解析网页内容并提取图片地址和名称4. 下载并保存图片完整代码关键代码讲解 结束语 前言 爬取网络上的图片是一种常见的需求&#xff0c;它可以帮助我们批量下载大量图片并进行后续处理。本文将介绍如何使…...

道本科技||全面建立国有企业合规管理体系

为全面深化国有企业法治建设&#xff0c;不断加强合规管理&#xff0c;防控合规风险&#xff0c;保障企业稳健发展&#xff0c;近日&#xff0c;市国资委印发《常州市市属国有企业合规管理办法&#xff08;试行&#xff09;》&#xff08;以下简称《办法》&#xff09;&#xf…...

CentOS 8上安装和配置Redis

在本篇博客中&#xff0c;我们将演示如何在CentOS 8上安装和配置Redis。我们将首先安装Redis&#xff0c;然后配置Redis以设置密码并允许公开访问。 步骤 1&#xff1a;安装Redis 首先&#xff0c;更新软件包列表&#xff1a; sudo yum update安装Redis&#xff1a; sudo yum …...

西北乱跑娃 -- CSS动态旋转果冻效果

<!DOCTYPE html> <html> <head> <meta charset"utf-8"> <title>旋转果冻</title> <style> #myDIV {margin: 250px;width: 250px;height: 250px;background: orange;position: relative;font-size: 20px;animation: anima…...

解决安装office出现1402错误和注册表编辑器无法设置安全性错误

写在前面 可能是由于之前的office没有卸载干净&#xff0c;看了很多文章&#xff0c;也有的说是使用了Windows Installer Clean Up卸载office的缘故&#xff0c;最后导致的结果是出现了再次安装office时出现了1402错误&#xff0c;而在解决1402错误的过程中&#xff0c;修改所…...

Jmeter接口自动化生成测试报告html格式

jmeter自带执行结果查看的插件&#xff0c;但是需要在jmeter工具中才能查看&#xff0c;如果要向领导提交测试结果&#xff0c;不够方便直观。 笔者刚做了这方面的尝试&#xff0c;总结出来分享给大家。 这里需要用到ant来执行测试用例并生成HTML格式测试报告。 一、ant下载安…...

移动IP的原理

目的 使得移动主机在各网络之间漫游时&#xff0c;仍然能保持其原来的IP地址不变 工作步骤 代理发现与注册 主机A&#xff1a;主机A移动到外地网络后&#xff0c;通过“代理发现协议”&#xff0c;与外地代理建立联系&#xff0c;并从外地代理获得一个转交地址&#xff0c;…...

uView 在 uni-app 中的使用

文章目录 一、uView是什么&#xff1f;1.uView 安装2.uView 在 uni-app 中的使用 一、uView是什么&#xff1f; 提示&#xff1a;正文内容&#xff1a; uView 官网&#xff1a; https://www.uviewui.com uView 是 uni-app 生态专用的 UI 框架 关于uView的取名来由&#xff0c…...

netcat和netstat使用

Linux是一款受欢迎的开源操作系统&#xff0c;在Linux系统中要安装用于终端连接的nc&#xff08;netcat&#xff09;工具&#xff0c;可以帮助我们快速管理网络服务&#xff0c;在此文中&#xff0c;我们将介绍如何在Linux系统下安装nc工具的详细步骤。 一.安装nc工具 1.首先…...

mybatisPlus高级篇

文章目录 主键生成策略介绍AUTO策略INPUT策略ASSIGN_ID策略ASSIGN_UUID策略NONE策略 MybatisPlus分页分页插件自定义分页插件 ActiveRecord模式SimpleQuery工具类SimpleQuery介绍listmapGroup 主键生成策略介绍 主键&#xff1a;在数据库中&#xff0c;主键通常用于快速查找和…...

Rust之包、单元包及模块

包&#xff1a;一个用于构建、测试并分享单元包的Cargo功能&#xff1b;单元包&#xff1a;一个用于生成库或可执行文件的树形模块结构&#xff1b;模块及use关键字&#xff1a;被用于控制文件结构、作用域及路径的私有性&#xff1b;路径&#xff1a;一种用于命名条目的方法&a…...

内存函数讲解

&#x1f495;"痛苦难以避免&#xff0c;而磨难可以选择。"-->村上春树&#x1f495; 作者&#xff1a;Mylvzi 文章主要内容&#xff1a;数据在内存中的存储 内存函数就是管理内存数据的函数&#xff0c;包含于头文件<string.h>中 1.memcpy函数-->内存…...

C语言假期作业 DAY 01

题目 1.选择题 1、执行下面程序&#xff0c;正确的输出是&#xff08; &#xff09; int x5,y7; void swap() { int z; zx; xy; yz; } int main() { int x3,y8; swap(); printf("%d,%d\n"&#xff0c;x, y)…...

2023牛客暑期多校-J-Qu‘est-ce Que C‘est?(DP)

题意&#xff1a; 给定长度为n的数列,要求每个数都在的范围&#xff0c;且任意长度大于等于2的区间和都大于等于0&#xff0c;问方案数。。 思路&#xff1a; 首先要看出是dp题&#xff0c;用来表示遍历到第i位且后缀和最小为x的可行方案数&#xff08;此时的后缀可以只有最…...

【141. 环形链表】

来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 描述&#xff1a; 给你一个链表的头节点 head &#xff0c;判断链表中是否有环。 如果链表中有某个节点&#xff0c;可以通过连续跟踪 next 指针再次到达&#xff0c;则链表中存在环。 为了表示给定链表中的环&#x…...

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…...

Swift 协议扩展精进之路:解决 CoreData 托管实体子类的类型不匹配问题(下)

概述 在 Swift 开发语言中&#xff0c;各位秃头小码农们可以充分利用语法本身所带来的便利去劈荆斩棘。我们还可以恣意利用泛型、协议关联类型和协议扩展来进一步简化和优化我们复杂的代码需求。 不过&#xff0c;在涉及到多个子类派生于基类进行多态模拟的场景下&#xff0c;…...

在web-view 加载的本地及远程HTML中调用uniapp的API及网页和vue页面是如何通讯的?

uni-app 中 Web-view 与 Vue 页面的通讯机制详解 一、Web-view 简介 Web-view 是 uni-app 提供的一个重要组件&#xff0c;用于在原生应用中加载 HTML 页面&#xff1a; 支持加载本地 HTML 文件支持加载远程 HTML 页面实现 Web 与原生的双向通讯可用于嵌入第三方网页或 H5 应…...

return this;返回的是谁

一个审批系统的示例来演示责任链模式的实现。假设公司需要处理不同金额的采购申请&#xff0c;不同级别的经理有不同的审批权限&#xff1a; // 抽象处理者&#xff1a;审批者 abstract class Approver {protected Approver successor; // 下一个处理者// 设置下一个处理者pub…...

RabbitMQ入门4.1.0版本(基于java、SpringBoot操作)

RabbitMQ 一、RabbitMQ概述 RabbitMQ RabbitMQ最初由LShift和CohesiveFT于2007年开发&#xff0c;后来由Pivotal Software Inc.&#xff08;现为VMware子公司&#xff09;接管。RabbitMQ 是一个开源的消息代理和队列服务器&#xff0c;用 Erlang 语言编写。广泛应用于各种分布…...

【从零开始学习JVM | 第四篇】类加载器和双亲委派机制(高频面试题)

前言&#xff1a; 双亲委派机制对于面试这块来说非常重要&#xff0c;在实际开发中也是经常遇见需要打破双亲委派的需求&#xff0c;今天我们一起来探索一下什么是双亲委派机制&#xff0c;在此之前我们先介绍一下类的加载器。 目录 ​编辑 前言&#xff1a; 类加载器 1. …...

Cilium动手实验室: 精通之旅---13.Cilium LoadBalancer IPAM and L2 Service Announcement

Cilium动手实验室: 精通之旅---13.Cilium LoadBalancer IPAM and L2 Service Announcement 1. LAB环境2. L2公告策略2.1 部署Death Star2.2 访问服务2.3 部署L2公告策略2.4 服务宣告 3. 可视化 ARP 流量3.1 部署新服务3.2 准备可视化3.3 再次请求 4. 自动IPAM4.1 IPAM Pool4.2 …...

数据库——redis

一、Redis 介绍 1. 概述 Redis&#xff08;Remote Dictionary Server&#xff09;是一个开源的、高性能的内存键值数据库系统&#xff0c;具有以下核心特点&#xff1a; 内存存储架构&#xff1a;数据主要存储在内存中&#xff0c;提供微秒级的读写响应 多数据结构支持&…...

2025-05-08-deepseek本地化部署

title: 2025-05-08-deepseek 本地化部署 tags: 深度学习 程序开发 2025-05-08-deepseek 本地化部署 参考博客 本地部署 DeepSeek&#xff1a;小白也能轻松搞定&#xff01; 如何给本地部署的 DeepSeek 投喂数据&#xff0c;让他更懂你 [实验目的]&#xff1a;理解系统架构与原…...

GeoServer发布PostgreSQL图层后WFS查询无主键字段

在使用 GeoServer&#xff08;版本 2.22.2&#xff09; 发布 PostgreSQL&#xff08;PostGIS&#xff09;中的表为地图服务时&#xff0c;常常会遇到一个小问题&#xff1a; WFS 查询中&#xff0c;主键字段&#xff08;如 id&#xff09;莫名其妙地消失了&#xff01; 即使你在…...