python函数传递list,tuple和dict时的复制关系

一直对python函数中的参数关系理不清,今天就来动手解决之!

一、首先看看list的参数:

  1 #!/usr/bin/env python
  2 
  3 def foo(ls):
  4     print id(ls)
  5     ls[0]=ls[1]+ls[2]
  6 
  7 def main():
  8     lst = [1991,12,04]
  9     foo(lst)
 10     print id(lst)
 11     print lst
 12 
 13 if __name__ == '__main__':
 14     main()

这个小代码结果显示:

140023038189864
140023038189864
[16, 12, 4]

可见函数传递过去的是指向lst的指针


二、对于tuple:

  1 #!/usr/bin/env python
  2 
  3 #def foo(tp):
  4 def foo(*tp):
  5 #   tp[2][0]=tp[2][1]+tp[2][2]
  6     print id(tp)
  7     print tp
  8 
  9 def main():
 10     tp = ('a','s',[1991,12,04])
 11     foo(tp)
 12     print id(tp)
 13     print tp
 14 
 15 if __name__ == '__main__':
 16     main()

140151903512976
(('a', 's', [1991, 12, 4]),)
140151903439760
('a', 's', [1991, 12, 4])

可见函数体的*把传递过来的参数包装为一个tuple,把代码改为:

  1 #!/usr/bin/env python
  2 
  3 #def foo(tp):
  4 def foo(*tp):
  5     tp[2][0]=tp[2][1]+tp[2][2]
  6     print id(tp)
  7     print tp
  8 
  9 def main():
 10     tp = ('a','s',[1991,12,04])
 11     foo(*tp)
 12     print id(tp)
 13     print tp
 14 
 15 if __name__ == '__main__':
 16     main()
结果显示:

140699484027472
('a', 's', [16, 12, 4])
140699484027792
('a', 's', [16, 12, 4])         

函数调用的*把本来是容器的对象分解为单个的元素,在有函数体的*吧他们组合起来,

可以发现,得到的新tp不再是原来的了。           

再次修改代码为:  

  1 #!/usr/bin/env python
  2 
  3 #def foo(tp):
  4 def foo(*tp):
  5     tp[2][0]=tp[2][1]+tp[2][2]
  6     print id(tp[0])
  7     print id(tp[1])
  8     print id(tp[2])
  9     print tp
 10 
 11 def main():
 12     tp = ('a','s',[1991,12,04])
 13     foo(*tp)
 14     print id(tp[0])
 15     print id(tp[1])
 16     print id(tp[2])
 17     print tp
 18 
 19 if __name__ == '__main__':
 20     main()                                                                   

结果显示:

140720297669896
140720297669776
140720296530216
('a', 's', [16, 12, 4])
140720297669896
140720297669776
140720296530216
('a', 's', [16, 12, 4])

可见各个元素id都一样。再次修改:

1 #!/usr/bin/env python
  2 
  3 #def foo(tp):
  4 def foo(*tp):
  5     tp[2][0]=tp[2][1]+tp[2][2]
  6     print id(tp[2][0])
  7     print id(tp[2][1])
  8     print id(tp[2][2])
  9     print tp
 10     
 11 def main():
 12     tp = ('a','s',[1991,12,04])
 13     foo(*tp)
 14     print id(tp[2][0])
 15     print id(tp[2][1])
 16     print id(tp[2][2])
 17     print tp
 18     
 19 if __name__ == '__main__':
 20     main()

40075248
40075344
40075536
('a', 's', [16, 12, 4])
40075248
40075344
40075536
('a', 's', [16, 12, 4])

由此可知,这样传递相当于做了浅层复制。

三、同样,dict:

  1 #!/usr/bin/env python
  2 
  3 def foo(**dc):
  4 #   print id(dc)
  5 #   pass
  6     dc['a'] = 24
  7     print dc
  8     print id(dc)
  9     print id(dc['(1,2)'])
 10 
 11 
 12 def main():
 13     dct = {'a':12,'s':600,'(1,2)':668}
 14 #   print dct[(1,2)]
 15     foo(**dct)
 16     print dct
 17     print id(dct)
 18     print id(dct['(1,2)'])
 19 #   print id(dct)
 20 
 21 if __name__=='__main__':
 22     main()

结果显示:

{'a': 24, '(1,2)': 668, 's': 600}
140698470995400
26000456
{'a': 12, '(1,2)': 668, 's': 600}
140698470959656
26000456

可见和tuple一样是浅层复制。

四、综上:

在函数的参数传递过程中,如果是直接的值传递,相当于把对象的引用(指针)传递过去,对于tuple和dict而言,对应的*和**则相当于进行了浅层复制的传递

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python中的list(列表),tuple(元组),dict(字典)和set(集合)是常见的数据结构。 1. 列表(list)是一个可变的、有序的元素集合。可以通过方括号[]来创建一个列表,列表中的元素可以是任意类型,并且可以重复。列表提供了丰富的操作方法,如添加元素、删除元素、获取元素等。 2. 元组(tuple)是一个不可变的、有序的元素集合。可以通过小括号()来创建一个元组,元组中的元素可以是任意类型。元组一旦创建后,不能修改其元素的值。元组通常用于存储不可变的数据,如坐标位置、颜色等。 3. 字典(dict)是一种键值对(key-value)的数据结构。可以通过花括号{}来创建一个字典,字典中的元素是无序的,并且每个元素由一个键和对应的值组成。字典中的键必须是唯一的,而值可以是任意类型。字典提供了根据键获取值、添加键值对、删除键值对等操作。 4. 集合(set)是一个无序的、不重复的元素集合。可以通过花括号{}或set()函数来创建一个集合,集合中的元素不能重复。集合提供了并集、交集、差集等常用的数学运算操作,同还支持元素的添加、删除等操作。 在编程中,根据具体的需求选择使用合适的数据结构能够更高效地处理数据,并且提供相应的操作方法方便开发。以上是对Python中常见的列表、元组、字典和集合的简要介绍。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值