python函数可以改变实际参数的值吗_python函数参数改不改变的问题-程序员宅基地

技术标签: python函数可以改变实际参数的值吗  

python函数参数改不改变的问题

**结论:**python有可变对象和不可变对象之分。如果传入的参数是不可变对象,则在函数体内对形参的修改不会导致实参被修改,而如果传入的是可变对象,实参有可能会变,也有可能不变,这取决于进行改变的操作。

不可变对象 : Number,String,Tuple,bool

可变对象 : List,Set,Dictionary

1.不可变对象

def test(str1):

str1 = "inside"

print("this is function "+str1)

str2 = "outside"

print("this is function "+str2)

test(str2)

print("this is function "+str2) # str2的值并没有被改变

运行结果:

this is function outside

this is function inside

this is function outside

对于其他不可变对象,结果一致。

2.可变对象的改变操作

def test(str1):

str1.append(3)

print("this is function,the value is ",str1)

myStr = [1,2]

print("this is function outside ,the value is ",myStr)

test(myStr)

print("this is function outside ,the value is ",myStr)

运行结果:

this is function outside ,the value is [1, 2]

this is function,the value is [1, 2, 3]

this is function outside ,the value is [1, 2, 3]

python中函数的形参,传入的是实参的引用,实质是指向实参的地址,所以对于形参的操作会改变实参的指。

3.可变对象的赋值改变操作

除了使用python的自带函数,也可通过赋值来修改实参的值:

def test(str1):

for i in range(len(str1)):

str1[i] = i+4

print("this is function,the value is ",str1)

myStr = [1,2]

print("this is function outside ,the value is ",myStr)

test(myStr)

print("this is function outside ,the value is ",myStr)

运行结果:

this is function outside ,the value is [1, 2]

this is function,the value is [4, 5]

this is function outside ,the value is [4, 5]

4.可变对象的不可变操作

def test(str1):

str1 = [1,2,3]

print("this is function,the value is ",str1)

myStr = [1,2]

print("this is function outside ,the value is ",myStr)

test(myStr)

print("this is function outside ,the value is ",myStr)

运行结果:

this is function outside ,the value is [1, 2]

this is function,the value is [1, 2, 3]

this is function outside ,the value is [1, 2]

正如上文所说,形参指向的是实参的地址,**当形参被重新赋值时,如果重新赋值后的对象所占的空间大小没有改变,则可以实现对实参的改变。**即对可变对象不改变长度 len(),则可以实现改变。

如果赋值后,形参的长度已经发生了改变,则python会创建一个新的变量,并把变量地址给形参,这时形参和实参不再指向同一个地址了,对形参的修改与实参毫无关系了。

验证如下:

def test(str1):

str1 = [1]

print("this is function,the value is ",str1)

myStr = [1,2]

print("this is function outside ,the value is ",myStr)

test(myStr)

print("this is function outside ,the value is ",myStr)

运行结果:

this is function outside ,the value is [1, 2]

this is function,the value is [1]

this is function outside ,the value is [1, 2]

pyChram 2020.1.3

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_33226548/article/details/114417632

智能推荐

Matlab R2014a使用 mcc编译出错的问题_2014a mcc license-程序员宅基地

文章浏览阅读8.7k次,点赞5次,收藏4次。Matlab R2014a使用mcc编译lib文件时出错,Error: Could not check out a Compiler license: SIGN= keyword required but missing from the license certificate. This is probably because the license is older than _2014a mcc license

Q115:Linux系统下CodeBlocks对PBRT-V3进行编译和调试_添加 pbrt vs-程序员宅基地

文章浏览阅读1.1k次。我也是醉了,在各种环境下对PBRT-V3进行了编译和调试。 参考:Q113:PBRT-V3分别在Linux和Mac下的编译与调试(汇总)不过,小编对CodeBlocks“情有独钟”,所以,必须在CodeBlocks下完成这个事情。(注意是Linux系统)一、用cmake生成CodeBlocks的工程文件二、编译三、调试_添加 pbrt vs

Ubuntu下Qt不能输入中文_qt里怎么弄不出拼音-程序员宅基地

文章浏览阅读3.4k次。碰到很多人问Linux版本的Qt怎么不能输入中文。今天解答一下,在我们的ubuntu系统一般大家都是安装的搜狗输入法。而搜狗输入法只能在浏览器或者其他地方能输入中文。在Qtcreator中无法输入中文。解决的方法就是安装其他输入法。以下是具体操作首先看是否已添加中文输入,点你的设置图标进入设置菜单中的语言支持进入语言支持看你的是否已经有汉语(中国),没有则选择下面的添加或删除语言选项,添加汉语简体。然后点击应用到整个系统。接下来Ctrl+Alt+T 调出 Terminal.._qt里怎么弄不出拼音

x264中重要结构体说明_param->rc.f_vbv_buffer_init-程序员宅基地

文章浏览阅读587次。首先解释一下cli_opt_t的这个_t代表结构体可能是type的意思。同时还有很多i_ b_等作为前缀的变量,其中的i_表示int类型的变量,b_表示bool类型的。依次类推。正式进入主题。(A)typedef struct { int b_progress; int i_seek; hnd_t hin; hnd_t hout; FILE_param->rc.f_vbv_buffer_init

Caused by: java.util.ConcurrentModificationException并发修改异常_error querying database. cause: java.util.concurre-程序员宅基地

文章浏览阅读2.3k次。org.apache.ibatis.exceptions.PersistenceException:### Error querying database. Cause: java.util.ConcurrentModificationException### The error may exist in com/mybatis/mapper/UserMapper.xml### The ..._error querying database. cause: java.util.concurrentmodificationexception

解决树莓派鼠标延迟/迟滞问题-转CSDN博主“Deiki”-sunziren-程序员宅基地

文章浏览阅读450次。本文转自CSDN:https://blog.csdn.net/deiki/article/details/73252942,因为我在为树莓派安装2.4G无线键鼠的时候,鼠标反应很慢,卡顿严重(换成有线鼠标就好了,而且这个无线鼠标在win10上面是正常的),最终按着这位兄弟的办法,解决了,为了记住这个解决方法,特此转到我的博客。  之前在树莓派上试了几款鼠标..._树莓派2.4g鼠标速度如何调节

随便推点

android .向sdcard写入json字符串、读取json字符保存到list<类>中供调用_android12 sdcard文件中的字符串-程序员宅基地

文章浏览阅读7.3k次。第一. 要向android项目libs文件夹里添加gson-2.2.2.jar文件。 Txt文件中的json字符串:[{"ID":1,"LineColor":-16776961,"FillColor":-16776961,"LineSpan":10,"LineWidth":1,"Display":true,"Selected":true}, {"ID":2,"LineColor_android12 sdcard文件中的字符串

Unity一键打包APP_一键打包app工具-程序员宅基地

文章浏览阅读629次。唉 ,好久没有写博客了,今天弄一个简单的工具类脚本吧,在我们开发中经常会出现频繁打包测试的功能,对于不懂Unity的一些测试和策划人员来说,他们不会啊,老是麻烦程序也不太好对吧,干脆直接来个工具吧,傻瓜式打包APP吧!哈哈哈~直接上代码~/**************************************************** 文件:BuildApp.cs 作者:LYZY..._一键打包app工具

什么是二叉平衡树,如何插入节点,删除节点,说出关键步骤。_什么是二叉平衡树,如何插入节点,删除节点,说出关键步骤。-程序员宅基地

文章浏览阅读296次。什么是二叉平衡树,如何插入节点,删除节点,说出关键步骤。_什么是二叉平衡树,如何插入节点,删除节点,说出关键步骤。

超文本标记语言是指Java_超文本标记语言(HTML)-程序员宅基地

文章浏览阅读1.9k次。超文本标记语言(HyperText MarkUp Language,HTML)HTML是用来制作网页的标记语言,HTML不需要编译,直接由浏览器解析;HTML文件是一个文本文件,包含了一些HTML元素, 标签等;HTML文件必须使用html或htm为文件名后缀;HTML是大小写不敏感的,HTML与html是一样的。HTML超文本标记语言,通过使用标记来描述文档结构和表现形式的一种语言,由浏览器进行..._java超文本标记语言转义

qmake qt工程用vs打开时出现 LNK1104: 无法打开文件“uiAccess=‘false‘ /MANIFESTDEPENDENCY:ty_无法打开文件“uiaccess='false-程序员宅基地

文章浏览阅读975次。说明LNK1104: 无法打开文件“uiAccess='false' /MANIFESTDEPENDENCY:ty 对于此类型问题现实可能各种原因导致,我目前提供的并不能解决每一位所产生的问题,勿怪。平台:vs2015 - qt5.7.1将通过 qmake -tp vc xxx.pro 产生xxx.vcxproj 通过vs2019打开 并选择对应的工具集编译时,出现LNK1104: 无法打开文件“uiAccess=‘false’ /MANIFESTDEPENDENCY:ty解决方案打开_无法打开文件“uiaccess='false

SODBASE CEP学习(十一):分布式集群_哪个分布式计算框架支持cep操作-程序员宅基地

文章浏览阅读869次。大家装SODBASE CEP Server的时候会发现,它本身就是一个分布式系统,可以非常方便的快速建立分布式运算模型。1. 启用集群方法只要修改sodbase-cep-server-webservice-1.0.1/configuration/configuration/db.properties即可。所有的计算服务器共享了一个状态服务器State Server,也就是db.proper_哪个分布式计算框架支持cep操作

推荐文章

热门文章

相关标签