鱼C论坛

 找回密码
 立即注册
查看: 1279|回复: 2

[已解决]当传入实参的类型为……时,……

[复制链接]
发表于 2023-6-1 16:31:01 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
1、若传入实参为整数、浮点数、布尔值、字符串等不可变类型时,在函数内部进行修改不会影响到原始实参的值 --- 这样说法对吗?

2、若传入实参为元组(也属于不可变类型/但属于容器类型),在函数内部进行修改也不会影响到原始实参的值 --- 这样说法对吗?可否举例说明?

3、若传入实参为列表、字典等可变类型(属于容器类型)时,,在函数内部进行修改会影响到原始实参的值 --- 这样说法对吗?

  
最佳答案
2023-6-1 16:37:02
本帖最后由 歌者文明清理员 于 2023-6-1 16:38 编辑

对的,不可变类型的实参在函数内部修改不会影响到原始实参的值。因为不可变类型是指其值不可被修改,而修改实参的值就相当于创建了一个新的对象,而不是修改原始实参对象本身。

对的,元组虽然属于容器类型,但它本身是不可变类型,因此在函数内部进行修改不会影响到原始实参的值。例如:

  1. def modify_tuple(t):
  2.     t += (4, 5)
  3.     print(t)

  4. my_tuple = (1, 2, 3)
  5. modify_tuple(my_tuple)  # 输出 (1, 2, 3, 4, 5)
  6. print(my_tuple)  # 输出 (1, 2, 3)
复制代码

对的,在函数内部对可变类型的实参进行修改会影响到原始实参的值,因为可变类型的实参指向的是同一块内存地址,所以在函数内部对它进行的修改会反映在原始实参中。例如:
  1. def modify_list(lst):
  2.     lst.append(4)
  3.     print(lst)

  4. my_list = [1, 2, 3]
  5. modify_list(my_list)  # 输出 [1, 2, 3, 4]
  6. print(my_list)  # 输出 [1, 2, 3, 4]
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-6-1 16:37:02 | 显示全部楼层    本楼为最佳答案   
本帖最后由 歌者文明清理员 于 2023-6-1 16:38 编辑

对的,不可变类型的实参在函数内部修改不会影响到原始实参的值。因为不可变类型是指其值不可被修改,而修改实参的值就相当于创建了一个新的对象,而不是修改原始实参对象本身。

对的,元组虽然属于容器类型,但它本身是不可变类型,因此在函数内部进行修改不会影响到原始实参的值。例如:

  1. def modify_tuple(t):
  2.     t += (4, 5)
  3.     print(t)

  4. my_tuple = (1, 2, 3)
  5. modify_tuple(my_tuple)  # 输出 (1, 2, 3, 4, 5)
  6. print(my_tuple)  # 输出 (1, 2, 3)
复制代码

对的,在函数内部对可变类型的实参进行修改会影响到原始实参的值,因为可变类型的实参指向的是同一块内存地址,所以在函数内部对它进行的修改会反映在原始实参中。例如:
  1. def modify_list(lst):
  2.     lst.append(4)
  3.     print(lst)

  4. my_list = [1, 2, 3]
  5. modify_list(my_list)  # 输出 [1, 2, 3, 4]
  6. print(my_list)  # 输出 [1, 2, 3, 4]
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-6-1 16:37:59 | 显示全部楼层
1. 正确。对于整数、浮点数、布尔值、字符串等不可变类型,函数内部进行修改会创建一个新的对象,而不影响原始实参的值。
2. 正确。元组也是不可变类型,因此在函数内部进行修改同样会创建一个新的对象,原始实参的值不会受到影响。

  

  1.    def foo(x):
  2.        print(f"x的id:{id(x)}")
  3.        x = x + (4,)
  4.        print(f"执行操作后x的id:{id(x)}")

  5.    t = (1, 2, 3)
  6.    print(f"t的id:{id(t)}")
  7.    foo(t)
  8.    print(f"执行函数后t的id:{id(t)}")
复制代码

   输出结果:
   
  

  1.    t的id:3094057667472
  2.    x的id:3094057667472
  3.    执行操作后x的id:3094060192208
  4.    执行函数后t的id:3094057667472
复制代码


3. 正确。列表、字典等可变类型在函数内部进行修改时,直接修改的是对象本身,而不是创建一个新的对象。这意味着原始实参的值会受到影响。

  

  1.    def bar(x):
  2.        print(f"x的id:{id(x)}")
  3.        x.append(4)
  4.    l = [1, 2, 3]
  5.    print(f"l的id:{id(l)}")
  6.    bar(l)
  7.    print(f"执行函数后l的值为:{l}")
复制代码

   
   输出结果:
   
  

  1.    l的id:48765784
  2.    x的id:48765784
  3.    执行函数后l的值为:[1, 2, 3, 4]
复制代码


求最佳答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-20 13:13

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表