资讯专栏INFORMATION COLUMN

【编程语言】Python 的参数传递、返回值、浅拷贝、深拷贝

PascalXie / 2104人阅读

摘要:作者本文原载于,不允许转载的参数传递的参数传递,无法控制引用传递还是值传递。对于不可变对象数字字符元组等的参数,更类似值传递对于可变对象列表字典等,更类似引用传递。

作者:LogM

本文原载于 https://segmentfault.com/u/logm/articles ,不允许转载~

1. Python 的参数传递

Python的参数传递,无法控制引用传递还是值传递。对于不可变对象(数字、字符、元组等)的参数,更类似值传递;对于可变对象(列表、字典等),更类似引用传递。

def fun1(n):
    print(n)   # n在没修改前,指向的地址和main函数中n指向的地址相同
    n = 20     # n在修改后,指向的地址发生改变,相当于新建了一个值为20的参数n

def fun2(l):
    print(l)   # l在没修改前,指向的地址和main函数中l指向的地址相同
    l = [5,6,7,8,9]  # l在修改后,指向的地址和main函数中l指向的地址仍相同,此时main函数中l的值也会改变

if __name__=="__main__":
    n = 10
    l = [1,2,3,4,5]

    fun1(n)
    fun2(l)

    print(n)    # n的值还是10
    print(l)    # l的值在fun2()中已经被改变
2. Python 的返回值

Python的返回值,无法控制引用传递还是值传递。对于不可变对象(数字、字符、元组等)的参数,更类似值传递;对于可变对象(列表、字典等),更类似引用传递。

str1 = "hi"
l1 = [1,2,3,4,5]

def fun1():
    return str1

def fun2():
    return l1

str2 = fun1()  # 此时,str1 和 str2 的指向地址是相同的
str2 = "hello"  # 修改后,str2 指向的地址发生改变,相当于新建了一个值为`hello`的变量

l2 = fun2()  # 此时,l1 和 l2 的指向地址是相同的
l2 = [6,7,8,9]  # 修改后,l2 指向的地址仍相同,修改 l2 会影响到 l1
3. Python 的浅拷贝和深拷贝

对于不可变对象(数字、字符、元组等),直接赋值的结果和深拷贝一致;对于可变对象(列表、字典等),直接赋值、浅拷贝、深拷贝结果不同。

# 不可变对象(数字、字符、元组等)的例子

a = 100  
b = a
b = 30

print("a: ", a)
print("b: ", b)

# 结果:
# a = 100
# b = 30
# 可变对象(列表、字典等)的例子

import copy

dict1 = {1:1, "user":"test", "num":[1, 2, 3]}

dict2 = dict1  # 直接赋值,两个字典指向地址一致
dict3 = dict1.copy()  # 浅拷贝,只拷贝到原对象
dict4 = copy.deepcopy(dict1)  # 深拷贝,除了拷贝原对象,也会拷贝子对象
 
dict1[1] = 11
dict1["user"] = "123"
dict1["num"].remove(1)
 
print("原字典修改后:",dict1)
print("直接赋值:",dict2)
print("浅拷贝:",dict3)
print("深拷贝:",dict4)

# 结果
# 原字典修改后:{1:11,"user": "123", "num": [2, 3]}
# 直接赋值:{1:11,"user": "123", "num": [2, 3]}
# 浅拷贝:{1:1,"user": "test", "num": [2, 3]}
# 深拷贝:{1:1,"user": "test", "num": [1, 2, 3]}

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/44130.html

相关文章

  • 探索php和python下对象拷贝拷贝

    摘要:对于而言,情况可能会有点小复杂,因为一切皆为对象,所以的普通赋值深拷贝和浅拷贝之间都是有细微区别的。二下的他们在中,对象的赋值和传递都是引用。 一、深拷贝与浅拷贝   深拷贝:赋值时值完全复制,完全的copy,对其中一个作出改变,不会影响另一个   浅拷贝:赋值时,引用赋值,相当于取了一个别名。对其中一个修改,会影响另一个   对于PHP而言,= 赋值时,普通对象是深拷贝,但对对象来说...

    wizChen 评论0 收藏0
  • 探索php和python下对象拷贝拷贝

    摘要:对于而言,情况可能会有点小复杂,因为一切皆为对象,所以的普通赋值深拷贝和浅拷贝之间都是有细微区别的。二下的他们在中,对象的赋值和传递都是引用。 一、深拷贝与浅拷贝   深拷贝:赋值时值完全复制,完全的copy,对其中一个作出改变,不会影响另一个   浅拷贝:赋值时,引用赋值,相当于取了一个别名。对其中一个修改,会影响另一个   对于PHP而言,= 赋值时,普通对象是深拷贝,但对对象来说...

    shinezejian 评论0 收藏0
  • python拷贝拷贝

    摘要:之前关于的作用域赋值参数传递,我们接连谈了几篇文章全菊变量和菊部变量关于函数参数传递,人都错了可变对象与不可变对象今天我们依然要就相关话题继续下去。这是由于它们是不可变对象,不存在被修改的可能,所以拷贝和赋值是一样的。 之前关于 Python 的作用域、赋值、参数传递,我们接连谈了几篇文章: 全菊变量和菊部变量 关于函数参数传递,80%人都错了 可变对象与不可变对象 今天我们依然要...

    ideaa 评论0 收藏0
  • 精选50道Python面试题,快来看看你已经掌握了多少道吧

    摘要:从存储的字符串表示中检索原始对象的过程称为。这称为命名空间。如果需要八进制或十六进制表示,请使用内置函数或。和有什么区别返回对象,而返回列表,并使用相同的内存,无论范围大小是多少。它提供了灵活性,并允许开发人员为他们的项目使用正确的工具。 ...

    zzir 评论0 收藏0
  • ES6 变量声明与赋传递拷贝拷贝详解

    摘要:变量声明与赋值值传递浅拷贝与深拷贝详解归纳于笔者的现代开发语法基础与实践技巧系列文章。变量声明在中,基本的变量声明可以用方式允许省略,直接对未声明的变量赋值。按值传递中函数的形参是被调用时所传实参的副本。 ES6 变量声明与赋值:值传递、浅拷贝与深拷贝详解归纳于笔者的现代 JavaScript 开发:语法基础与实践技巧系列文章。本文首先介绍 ES6 中常用的三种变量声明方式,然后讨论了...

    snowLu 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<