鱼C论坛

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

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

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

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

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

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

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

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

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

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

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

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

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

使用道具 举报

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

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

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

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

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

使用道具 举报

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

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

   t = (1, 2, 3)
   print(f"t的id:{id(t)}")
   foo(t)
   print(f"执行函数后t的id:{id(t)}")
   输出结果:
   
   t的id:3094057667472
   x的id:3094057667472
   执行操作后x的id:3094060192208
   执行函数后t的id:3094057667472

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

   def bar(x):
       print(f"x的id:{id(x)}")
       x.append(4)
   l = [1, 2, 3]
   print(f"l的id:{id(l)}")
   bar(l)
   print(f"执行函数后l的值为:{l}")
   
   输出结果:
   
   l的id:48765784
   x的id:48765784
   执行函数后l的值为:[1, 2, 3, 4]

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-22 23:21

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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