首页 > 编程语言 >python值传递与引用问题

python值传递与引用问题

时间:2023-09-17 23:55:38浏览次数:41  
标签:python list id 传递 num 引用 print copied original

关于python中的值传递与引用问题

  • 首先看下面这段代码

'''

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

copied_list = original_list
copied_list[2][0] = 'a'

print(original_list)

输出结果为[1,2,['a',4]]

这里本意是想为original_list复制一个副本后使用从而不更改原始列表的值,但是发现这个复制的副本的值改变后原始列表的值也发生改变了。

字典也有同样的情况:
'''

original_dict = {'a':12,'b':'string'}
copied_dict = original_dict
copied_dict['a'] = 34
print(original_dict)

输出结果为{'a':34, 'b':'string'}

但是对于不可变对象例如整型变量等就没有这种情况:
'''

original_num = 12
copied_num = original_num
copied_num = 3
print(original_num)

输出结果为12.

出现这种情况的原因在于python对于可变对象(列表、字典)和不可变对象(整型、字符串...)的传递处理是不同的。

  • 对于可变对象(例如列表、字典、集合等),它们的值是可以被修改的。当你将可变对象传递给一个函数或将其赋值给另一个变量时,实际上是将对象的引用传递给了函数或变量。这意味着对对象进行的修改在所有引用它的地方都是可见的,因为它们引用的是同一个对象。(这一点和C语言中的指针传递类似)

  • 对于不可变对象(例如整数、字符串、元组等),每当你对其进行修改时,实际上是创建了一个新的对象,并将新对象的引用赋值给变量。这是因为不可变对象的值是不可更改的,为了在修改时保持数据的不变性,Python会创建一个新的对象来存储修改后的值。

  • 解决方法

1、使用copy模块:
'''

import copy

original_list = [1, 2, [3, 4]]
copied_list = copy.deepcopy(original_list)

copied_list[2][0] = 'a'

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

2、不使用引用
'''

original_list = [1, 2, [3, 4]]
copied_list = []
#copied_list = original_list
copied_list  += original_list +['a']

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

3、注意python中的'+='

  • 先看下面两段代码:

'''

original_list = [1, 2, [3, 4]]
#copied_list = []
copied_list = original_list
copied_list  += ['a']

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

'''

original_list = [1, 2, [3, 4]]
#copied_list = []
copied_list = original_list
copied_list  = copied_list + ['a']

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

这两段代码逻辑基本一致,唯一的区别就是前者使用了'+=',后者则在逻辑上将'+='拆开了(copied_list = copied_list + ['a']),如果这是在C语言中那这两者的结果应该是一样的,但是python3中对于可变对象的'+='和将其拆开的逻辑是有区别的
使用 '+=' 会在原始对象上进行就地修改,而 x = x + ... 会创建一个新的对象,并将其赋值给变量 x

  • 看下面两段代码

'''

original_list = [1, 2, [3, 4]]
#copied_list = []
copied_list = original_list
print(id(original_list)) #输出2429054333312
print(id(copied_list)) #输出2429054333312
copied_list  = copied_list + ['a']
print(id(copied_list)) #输出2429054455040
#具体数字不重要,重要的是两个地址的值不同了

'''

original_list = [1, 2, [3, 4]]
#copied_list = []
copied_list = original_list
print(id(original_list)) #输出2487616975360
print(id(copied_list)) #输出2487616975360
copied_list  += ['a']
print(id(copied_list)) #输出2487616975360
#可以看到地址没有发生变化
  • 再补充一点,关于python中的不可变对象。在python中这些不可变对象本身就存在于固定的地址空间中(类似于C语言的常数)而在引用不可变对象时实际上是将变量指向这些地址空间,可以看下面的代码:

'''

original_num = 12
copied_num = original_num
print(id(12))
print(id(original_num))
print(id(copied_num))
#三者输出一致(140711921968264),且不论运行几次结果都一样
copied_num = 3
print(id(original_num))#输出:140711921968264
print(id(3))
print(id(copied_num))
#二者输出一致(140711921967976)且不论运行几次结果都一样

标签:python,list,id,传递,num,引用,print,copied,original
From: https://www.cnblogs.com/littlejazzcat/p/17710297.html

相关文章

  • python多线程
    Python多线程参考文章:python多线程详解(超详细)、Python线程池(threadpool)创建及使用+实例代码、第二十章多线程1、多线程的概念2、python多线程的基本使用方法3、多线程的优点及与多进程的关系1、多线程的概念线程也叫轻量级进程,是操作系统能够进行运算调度......
  • jQuery与Ajax:“特别的”load()方法(筛选文档、传递方法、回调函数)
    “大名鼎鼎的”jQuery因为其极简的引用方式而在N年前备受追捧,而今“浪潮”过去,还剩下什么?我认识jQuery,只是在去年接触ajax时了解,从而感兴趣,进而深入探究(其实也没多深入,只是相关的看了一下)。不得不说,jQuery对ajax支持的四个type:post(一般用于发送)、get(一般常用于接收)、put(修改)、dele......
  • Python入门系列1-基础语法
    一、标识符标识符由字母、数字和下划线组成,但是不能以数字开头。标识符是区分大小写的。以下划线开头的标识有特殊意义。以单下划线开头_foo的代表不能直接访问的类属性,需要通过类提供的接口进行访问,以双下划线开头的__foo代表类的私有成员,以双下划线开头和结尾的__foo__代表Python......
  • 使用Python的requests库自定义请求
    importrequestsfromrequestsimportRequest,Sessionurl="http://challenge-d590d34746e26bc5.sandbox.ctfhub.com:10800/index.php"headers={"user-agent":"Mozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit/537.36(KHTML,lik......
  • python解压缩zip文件, 同时显示进度信息
    直接上代码:fromtqdmimporttqdmimportzipfiledefunzip(zipFile):'''把ZIP文件解压到以文件名命名的目录中'''#获得文件名(不含后缀),作为解压缩的目录dir_name=os.path.dirname(zipFile)#获取zip文件所在的目录名filename=os.path.basename(......
  • Python 注释:解释和优化代码可读性
    注释可以用来解释Python代码。注释可以用来使代码更易读。注释可以用来在测试代码时防止执行。创建注释注释以#开始,Python会忽略它们:示例:获取您自己的Python注释#这是一个注释print("Hello,World!")注释可以放在一行的末尾,Python会忽略行的其余部分:示例print("Hello,W......
  • python实现一个简单的背单词程序
    功能需求给定一个words.txt文档,里面存放单词及其释意,要求编写一个python程序,实现自动背刺功能:程序开始时,首先随机给用户一个单词和其释义,用户自行选择师是否记住该单词,如果选择记住的话,程序会将该单词标记为需要记忆,在接下来的操作中会继续出现这个单词,直到用户不需要记忆为止;如果......
  • 在 Windows 系统下安装和使用 PyCharm:Python 开发的得力助手
    PyCharm是一款强大的Python集成开发环境(IDE),它提供了丰富的功能和工具,可帮助开发人员更轻松地编写、调试和管理Python项目。本博客将介绍如何在Windows系统下安装和使用PyCharm,以及一些基本的使用技巧。步骤1:下载PyCharm首先,让我们从JetBrains官网下载PyCharm的最新......
  • python04
    4.3布尔类型(bool)布尔类型中共有两个值:True/Falseprint(1>2)print(False)print(1==1)print(True)name=input("请输入你的用户名:")ifname=="alex":print("用户登录成功")else:print("用户登录失败")补充:1>21==3&quo......
  • Python-day10
    #函数defadd(a,b):c=a+breturncresult=add(10,20)print(result)res=add(a=11,b=22)print(res)deffun(arg1,arg2):print('arg1',arg1)print('arg2',arg2)arg1=100arg2.append(10)print('arg1',arg1......